ios - ViewContext 未从 newBackgroundContext() 接收更新
问题描述
堆栈溢出中已经有一个类似的问题,但它对我不起作用。
在我的应用程序中有一个用例,我必须观察数据库更改才能执行某些操作。为了接收更新,我订阅了 NSManagedObjectContextObjectsDidChange
通知(针对 ViewContext)并且我打开了automaticallyMergesChangesFromParent
.
但是,如果我update
或delete
其他上下文中的对象(使用newBackgroundContext()
),我不会收到对象确实更改通知,但它对inserting
新对象非常有效。
有人可以指导我为什么它仅适用于插入,即使在启用后也不适用于更新和删除automaticallyMergesChangesFromParent
?如果这是实际行为,还有其他方法可以解决我的用例吗?
文档(in NSManagedObjectContext.h
).automaticallyMergesChangesFromParent
说:
上下文是否自动合并保存到其协调器或父上下文的更改。当上下文固定到非当前查询生成时,不支持将此属性设置为 YES。
我试过的
- 我通过测试是否已在视图上下文中注册更新/删除的对象来进行调试。是的,那些已经注册了。
- 我用
NSFetchResultController
它测试了同样的东西,但不幸的是,我不能使用NSFetchResultController
,因为我使用自定义视图来表示数据 - 另外,我尝试创建一个新的
privateQueueConcurrencyType
上下文并设置viewContext
为父级,它出人意料地开始工作,所以问题只是在使用时,newBackgroundContext()
但根据文档,它应该可以正常工作,因为两者都使用相同NSPersistentStoreCoordinator
提前致谢!
解决方案
“我不能使用NSFetchResultController
自定义视图来表示数据”不是真的,FRC 可以而且应该与任何视图(显示多个对象)一起使用。
至于为什么NSManagedObjectContextObjectsDidChange
在更新(刷新)或删除的情况下您没有收到,我有一些理论:
可能没有正确调用
_persistentContainer.viewContext.automaticallyMergesChangesFromParent = YES;
,因为这正是您描述的情况(接收插入但不接收更新或删除)。它应该在之后loadPersistentStoresWithCompletionHandler
(而不是在块内)在您的应用程序委托中的 persistentContainer 自定义 getter 中完成。也许不
performBlock
与您的背景上下文一起使用。可能未正确注册更改通知。
(根据新信息)不保留获取的对象。
如果您想分享一些代码,我们可以帮助您追踪错误。
推荐阅读
- node.js - Mongoose 中间件 schema.pre('save', ...)
- c# - C# 常量数组搜索
- python-3.x - 如何使用 python 为简单的 e2e 聊天应用程序添加媒体支持
- laravel - 如何修改 Laravel API 资源收集响应以在“数据”包装器中包含另一个“数据”包装器?
- asp.net-core - 聚合异常 Asp.Net Core 5.0
- maven - java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory - 与 Appium 相关
- docker - 如何在 docker 中启用/禁用 buildkit?
- google-sheets - 谷歌表 - 自定义时间戳脚本不适用于 Andriod
- firebase - Flutter:动态链接未启动应用程序
- scala - Scala中递归数据类型的数据结构