ViewContext 没有收到来自 newBackgroundContext() 的更新
ViewContext not receiving updates from newBackgroundContext()
堆栈溢出中已经有类似的问题,但它对我不起作用。
在我的应用程序中有一个用例,我必须观察数据库更改才能执行某些操作。为了接收更新,我订阅了 NSManagedObjectContextObjectsDidChange
通知(对于 ViewContext)并且我还打开了 automaticallyMergesChangesFromParent
.
但是,如果我 update
或 delete
其他上下文中的对象(使用 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.
我试过的
- 我通过测试 updated/deleted 对象是否已经存在来进行调试
在视图上下文中注册。是的,已经注册了。
- 我用
NSFetchResultController
测试了同样的东西,它工作正常
很好,但不幸的是,我不能使用 NSFetchResultController
,因为我
使用自定义视图来表示数据
- 此外,我尝试创建一个新的
privateQueueConcurrencyType
上下文并将 viewContext
设置为父级,但它令人惊讶地开始工作,所以问题仅在使用 newBackgroundContext()
时出现,但根据文档应该正常工作,因为两者都使用相同的 NSPersistentStoreCoordinator
提前致谢!
可能不完全是答案,只是一些想法和建议,结构不够完善,无法发表评论。
这可能与 viewContext 没有保留对象有关,而只是因为它们不再被直接使用(例如在表视图中)而导致的错误。会有 retainsRegisteredObjects。
此外,您是否访问过在 viewContext 中已更改的 属性?这也可能是一个问题,它无法识别从未读取过的对象上的更改。
我强烈建议在这些情况下使用一个或多个 FRC,它们可以为您桥接通知并提供更简洁的界面。如果你有一个自定义视图并不重要,只要实现 FRCDelegate 方法就可以了。如果您再问一个问题,为什么您不能在自定义视图中使用 FRC(问题出在哪里?),我认为可以更轻松地为您提供帮助。
"I can’t use NSFetchResultController
as I use a custom view to represent the data" 不正确,FRC 可以而且应该用于任何视图(显示多个对象)。
至于为什么在更新(以刷新形式出现)或删除时您没有收到 NSManagedObjectContextObjectsDidChange
,我有一些理论:
可能没有正确调用 _persistentContainer.viewContext.automaticallyMergesChangesFromParent = YES;
因为这会导致您描述的情况(接收插入但不接收更新或删除)。它应该在 loadPersistentStoresWithCompletionHandler
之后(而不是在块内)的应用程序委托中的 persistentContainer 自定义 getter 中完成。
可能没有将 performBlock
与您的背景上下文一起使用。
可能没有正确注册更改通知。
(根据新信息)不保留获取的对象。
如果您想分享一些代码,我们可以帮助您追踪错误。
堆栈溢出中已经有类似的问题,但它对我不起作用。
在我的应用程序中有一个用例,我必须观察数据库更改才能执行某些操作。为了接收更新,我订阅了 NSManagedObjectContextObjectsDidChange
通知(对于 ViewContext)并且我还打开了 automaticallyMergesChangesFromParent
.
但是,如果我 update
或 delete
其他上下文中的对象(使用 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.
我试过的
- 我通过测试 updated/deleted 对象是否已经存在来进行调试 在视图上下文中注册。是的,已经注册了。
- 我用
NSFetchResultController
测试了同样的东西,它工作正常 很好,但不幸的是,我不能使用NSFetchResultController
,因为我 使用自定义视图来表示数据 - 此外,我尝试创建一个新的
privateQueueConcurrencyType
上下文并将viewContext
设置为父级,但它令人惊讶地开始工作,所以问题仅在使用newBackgroundContext()
时出现,但根据文档应该正常工作,因为两者都使用相同的NSPersistentStoreCoordinator
提前致谢!
可能不完全是答案,只是一些想法和建议,结构不够完善,无法发表评论。
这可能与 viewContext 没有保留对象有关,而只是因为它们不再被直接使用(例如在表视图中)而导致的错误。会有 retainsRegisteredObjects。
此外,您是否访问过在 viewContext 中已更改的 属性?这也可能是一个问题,它无法识别从未读取过的对象上的更改。
我强烈建议在这些情况下使用一个或多个 FRC,它们可以为您桥接通知并提供更简洁的界面。如果你有一个自定义视图并不重要,只要实现 FRCDelegate 方法就可以了。如果您再问一个问题,为什么您不能在自定义视图中使用 FRC(问题出在哪里?),我认为可以更轻松地为您提供帮助。
"I can’t use NSFetchResultController
as I use a custom view to represent the data" 不正确,FRC 可以而且应该用于任何视图(显示多个对象)。
至于为什么在更新(以刷新形式出现)或删除时您没有收到 NSManagedObjectContextObjectsDidChange
,我有一些理论:
可能没有正确调用
_persistentContainer.viewContext.automaticallyMergesChangesFromParent = YES;
因为这会导致您描述的情况(接收插入但不接收更新或删除)。它应该在loadPersistentStoresWithCompletionHandler
之后(而不是在块内)的应用程序委托中的 persistentContainer 自定义 getter 中完成。可能没有将
performBlock
与您的背景上下文一起使用。可能没有正确注册更改通知。
(根据新信息)不保留获取的对象。
如果您想分享一些代码,我们可以帮助您追踪错误。