【发布时间】:2019-11-12 03:47:56
【问题描述】:
堆栈溢出中已经有类似的问题,但它对我不起作用。
在我的应用程序中有一个用例,我必须观察数据库更改才能执行某些操作。为了接收更新,我订阅了NSManagedObjectContextObjectsDidChange 通知(用于 ViewContext),并且我打开了automaticallyMergesChangesFromParent。
但是,如果我在其他上下文中 update 或 delete 对象(使用 newBackgroundContext()),我不会收到对象确实更改通知,但它对于 inserting 新对象非常有效。
有人可以指导我为什么即使启用automaticallyMergesChangesFromParent 后它也只适用于插入,而不适用于更新和删除?如果这是实际行为,还有其他方法可以解决我的用例吗?
.automaticallyMergesChangesFromParent 的文档(NSManagedObjectContext.h)说:
上下文是否自动合并保存到它的更改 协调者或父上下文。将此属性设置为 YES 时 不支持将上下文固定到非当前查询生成。
我尝试了什么
- 我通过测试是否已经更新/删除的对象进行了调试 在视图上下文中注册。是的,这些都已经注册了。
- 我用
NSFetchResultController测试了同样的东西,它工作正常 很好,但不幸的是,我不能像我一样使用NSFetchResultController使用自定义视图来表示数据 - 另外,我尝试创建一个新的
privateQueueConcurrencyType上下文并将viewContext设置为父级,它令人惊讶地开始工作,所以问题仅在使用newBackgroundContext()时出现,但根据文档,它应该可以正常工作,因为两者都使用相同NSPersistentStoreCoordinator
提前致谢!
【问题讨论】:
-
您为什么使用通知?你可以使用 fetchedResultsController 来监控上下文吗?
-
在我的用例中,我不能使用 FRC,所以我决定使用通知,请参阅下面的链接。 stackoverflow.com/questions/55686097/…
-
顺便说一句,如果您认为它会在 FRC 中运行良好,那么为什么它不在通知中我真的相信 FRC 也会在幕后观察相同的通知。
-
1) 怀疑问题是对象在您将更改合并到的上下文中没有错误(我不确定,所以我不做这个答案)。 2)我读了你的另一个问题。您仍应使用 FRC。我总是使用 FRCS。我什至只对一个对象使用 FRC。 (也许使用2?)。祝你好运!
-
我尝试在示例项目中使用 FRC,它运行良好,但在我的用例中,我将在 3 个不同的 UI 中显示数据,其中只有一个是表格视图,我可以在其中使用 FRC 它可以解决剩下的两个呢?我在哪里使用 fetch request 获取数据并在自定义视图中显示它们在这里我们不需要使用 FRC 我们如何解决它?
标签: ios core-data nsmanagedobject nsmanagedobjectcontext nspersistentcontainer