堆栈溢出中已经有一个类似的问题,但对我而言不起作用。
在我的应用程序中有一个用例,我必须观察数据库的更改以执行某些操作。为了接收更新,我订阅了NSManagedObjectContextObjectsDidChange
通知(适用于ViewContext),还打开了automaticallyMergesChangesFromParent
。
但是,如果我在其他上下文上使用update
或delete
对象(使用newBackgroundContext()
),则不会收到更改通知,但是对象{{1 }}新对象。
您能否指导我,为什么启用inserting
后,它仅对插入有效,而对更新和删除无效?如果是实际行为,还有其他方法可以解决我的用例吗?
automaticallyMergesChangesFromParent
的文档(在NSManagedObjectContext.h
中)说:
上下文是否自动合并保存到其上下文的更改 协调者或父上下文。在以下情况下将此属性设置为YES: 不支持将上下文固定到非当前查询。
我尝试过的事情
.automaticallyMergesChangesFromParent
测试了同样的东西
很好,但很遗憾,我不能使用NSFetchResultController
使用自定义视图表示数据NSFetchResultController
上下文并将privateQueueConcurrencyType
设置为父级,并且令人惊讶地开始工作,因此该问题仅在使用viewContext
时有效,但根据文档它应该可以正常工作正确,因为两者都使用相同的newBackgroundContext()
谢谢!
答案 0 :(得分:1)
“我不能使用NSFetchResultController
,因为我使用自定义视图来表示数据”不是,FRC可以并且应该与任何视图(显示多个对象)一起使用。
关于为什么更新(以刷新形式出现)或删除时没有收到NSManagedObjectContextObjectsDidChange
的原因,我有一些理论:
可能没有正确地调用_persistentContainer.viewContext.automaticallyMergesChangesFromParent = YES;
,因为这正好导致您描述的情况(接收插入,但不接收更新或删除)。应该在loadPersistentStoresWithCompletionHandler
之后(而不是在块内)在应用程序委托中的persistentContainer自定义getter中完成。
可能未在背景上下文中使用performBlock
。
可能未正确注册更改通知。
(根据新信息)不保留获取的对象。
如果您想共享一些代码,我们可以帮助您查找错误。
答案 1 :(得分:0)
可能不是一个完整的答案,而只是一些想法和建议的结构不够完善,无法发表评论。
这可能与不保留对象的viewContext有关,而仅仅是因为错误,因为不再直接使用它们(例如在表视图中)。将会有 retainsRegisteredObjects 。
此外,您是否曾经访问过viewContext中已更改的属性?这也可能是一个问题,因为它无法识别从未读取的对象的更改。
对于这些情况,我强烈建议使用一个或多个FRC,它们会为您桥接通知并提供更简洁的界面。拥有自定义视图并不重要,只需实现FRCDelegate方法,就可以了。我认为,如果您提出另一个问题,为什么不能在自定义视图中使用FRC(问题出在哪里?),可能会更容易为您提供帮助。