ViewContext没有从newBackgroundContext()接收更新

时间:2019-07-01 13:22:07

标签: ios core-data nsmanagedobject nsmanagedobjectcontext nspersistentcontainer

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

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

但是,如果我在其他上下文上使用updatedelete对象(使用newBackgroundContext()),则不会收到更改通知,但是对象{{1 }}新对象。

您能否指导我,为什么启用inserting后,它仅对插入有效,而对更新和删除无效?如果是实际行为,还有其他方法可以解决我的用例吗?

automaticallyMergesChangesFromParent的文档(在NSManagedObjectContext.h中)说:

  

上下文是否自动合并保存到其上下文的更改   协调者或父上下文。在以下情况下将此属性设置为YES:   不支持将上下文固定到非当前查询。

我尝试过的事情

  • 我通过测试是否已更新/删除对象来进行调试 在视图上下文中注册。是的,那些已经注册。
  • 我使用.automaticallyMergesChangesFromParent测试了同样的东西 很好,但很遗憾,我不能使用NSFetchResultController 使用自定义视图表示数据
  • 此外,我尝试创建一个新的NSFetchResultController上下文并将privateQueueConcurrencyType设置为父级,并且令人惊讶地开始工作,因此该问题仅在使用viewContext时有效,但根据文档它应该可以正常工作正确,因为两者都使用相同的newBackgroundContext()

谢谢!

2 个答案:

答案 0 :(得分:1)

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

关于为什么更新(以刷新形式出现)或删除时没有收到NSManagedObjectContextObjectsDidChange的原因,我有一些理论:

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

  2. 可能未在背景上下文中使用performBlock

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

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

如果您想共享一些代码,我们可以帮助您查找错误。

答案 1 :(得分:0)

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

这可能与不保留对象的viewContext有关,而仅仅是因为错误,因为不再直接使用它们(例如在表视图中)。将会有 retainsRegisteredObjects

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

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