9

堆栈溢出中已经有一个类似的问题,但它对我不起作用。

在我的应用程序中有一个用例,我必须观察数据库更改才能执行某些操作。为了接收更新,我订阅了 NSManagedObjectContextObjectsDidChange通知(针对 ViewContext)并且我打开了automaticallyMergesChangesFromParent.

但是,如果我updatedelete其他上下文中的对象(使用newBackgroundContext()),我不会收到对象确实更改通知,但它对inserting新对象非常有效。

有人可以指导我为什么它仅适用于插入,即使在启用后也不适用于更新和删除automaticallyMergesChangesFromParent?如果这是实际行为,还有其他方法可以解决我的用例吗?

文档(in NSManagedObjectContext.h.automaticallyMergesChangesFromParent说:

上下文是否自动合并保存到其协调器或父上下文的更改。当上下文固定到非当前查询生成时,不支持将此属性设置为 YES。

我试过的

  • 我通过测试是否已在视图上下文中注册更新/删除的对象来进行调试。是的,那些已经注册了。
  • 我用NSFetchResultController它测试了同样的东西,但不幸的是,我不能使用NSFetchResultController,因为我使用自定义视图来表示数据
  • 另外,我尝试创建一个新的privateQueueConcurrencyType上下文并设置viewContext为父级,它出人意料地开始工作,所以问题只是在使用时,newBackgroundContext()但根据文档,它应该可以正常工作,因为两者都使用相同NSPersistentStoreCoordinator

提前致谢!

4

2 回答 2

4

“我不能使用NSFetchResultController自定义视图来表示数据”不是真的,FRC 可以而且应该与任何视图(显示多个对象)一起使用。

至于为什么NSManagedObjectContextObjectsDidChange在更新(刷新)或删除的情况下您没有收到,我有一些理论:

  1. 可能没有正确调用_persistentContainer.viewContext.automaticallyMergesChangesFromParent = YES;,因为这正是您描述的情况(接收插入但不接收更新或删除)。它应该在之后loadPersistentStoresWithCompletionHandler(而不是在块内)在您的应用程序委托中的 persistentContainer 自定义 getter 中完成。

  2. 也许不performBlock与您的背景上下文一起使用。

  3. 可能未正确注册更改通知。

  4. (根据新信息)不保留获取的对象。

如果您想分享一些代码,我们可以帮助您追踪错误。

于 2019-07-21T04:36:36.900 回答
0

可能不完全是一个答案,而只是一些想法和建议,结构不够好,无法发表评论。

它可能与 viewContext 没有保留对象有关,而只是故障,因为它们不再被直接使用(例如在 tableview 中)。为此会有保留注册对象。

另外,您是否曾经访问过 viewContext 中已更改的属性?这也可能是一个问题,它无法识别从未被读取的对象上的更改。

我强烈建议在这些情况下使用一个或多个 FRC,它们会为您桥接通知并提供更简洁的界面。如果您有自定义视图并不重要,只需实现 FRCDelegate 方法就可以了。如果您问另一个问题,为什么您不能在自定义视图中使用 FRC(问题在哪里?),我认为这可能会更容易为您提供帮助。

于 2019-07-15T12:08:10.173 回答