ViewContext没有从newBackgroundContext()接收更新

tha*_*rai 8 core-data nsmanagedobject nsmanagedobjectcontext ios nspersistentcontainer

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

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

但是,如果我updatedelete某个对象在其他上下文上(使用newBackgroundContext()),则我不会收到对象发生更改通知,但它对于inserting新对象而言效果很好。

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

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

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

我尝试了什么

  • 我通过测试是否已在视图上下文中注册更新/删除的对象进行调试。是的,那些已经注册。
  • 我使用NSFetchResultController它的正常工作测试了同一件事,但不幸的是,NSFetchResultController由于使用自定义视图来表示数据,因此无法使用
  • 另外,我尝试创建一个新的privateQueueConcurrencyType上下文并将其设置viewContext为父级,并且令人惊讶地开始工作,因此问题仅在使用时出现,newBackgroundContext()但根据文档,它应该正常工作,因为两者都使用相同NSPersistentStoreCoordinator

提前致谢!

mal*_*hal 6

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

\n\n

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

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

  2. \n
  3. performBlock也许不与您的背景环境一起使用。

  4. \n
  5. 可能没有正确注册更改通知。

  6. \n
  7. (根据新信息)不保留获取的对象。

  8. \n
\n\n

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

\n