ViewContext 没有收到来自 newBackgroundContext() 的更新

ViewContext not receiving updates from newBackgroundContext()

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

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

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

你能告诉我为什么即使在启用 automaticallyMergesChangesFromParent 之后,它也只能用于插入,而不能用于更新和删除吗?如果这是实际行为,还有其他方法可以解决我的用例吗?

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

Whether the context automatically merges changes saved to its coordinator or parent context. Setting this property to YES when the context is pinned to a non-current query generation is not supported.

我试过的

提前致谢!

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

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

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

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

"I can’t use NSFetchResultController as I use a custom view to represent the data" 不正确,FRC 可以而且应该用于任何视图(显示多个对象)。

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

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

  2. 可能没有将 performBlock 与您的背景上下文一起使用。

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

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

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