在 mergeChangesFromContextDidSaveNotification 之后 CoreData 关系为零
Posted
技术标签:
【中文标题】在 mergeChangesFromContextDidSaveNotification 之后 CoreData 关系为零【英文标题】:CoreData relationships are nil after mergeChangesFromContextDidSaveNotification 【发布时间】:2012-02-24 00:35:48 【问题描述】:在 ios 上使用 Core Data 有一些真正奇怪的行为。
我的主线程有一个NSManagedObjectContext
,用于从 SQLLite 持久存储读取数据并将其显示给用户。我也有由NSOperationQueue
管理的后台进程。这些后台进程创建一个NSMangedObjectContext
,从远程服务器获取数据,并将该数据持久化到本地核心数据存储。
我已经注册了NSManagedObjectContextDidSaveNotification
,当我收到这些通知时,我在主线程的NSManagedObjectContext
上调用mergeChangesFromContextDidSaveNotification
(将通知对象作为参数传递)。
这都是非常标准的,也是所有 Core Data 文档都建议您处理多线程的方式。
直到最近,我一直在向数据存储中插入新对象,而不是修改数据存储中的对象。这工作得很好。在后台线程写入新数据后,合并发生,我向 UIController 发送通知并重绘我的显示。显示正确。
最近做了个改动,后台线程既插入又修改对象。但是模式的所有其余部分保持不变。现在合并后,我的主线程NSManagedObjectContext
中的数据已损坏。如果我尝试查询对象,我将一无所获。如果我尝试检查我已经引用了它们所有关系的对象,则它们的关系为零(不是故障,而是零)。我检查了SQLLite数据库,数据都在那里。
唯一的解决方案似乎是重置NSManagedObjectContext
,鉴于应用程序的架构,这是不可接受的。
好的,最后一点奇怪。如果我的后台线程只更新属性(基元),那么我不会得到这种奇怪的行为。但是,如果我自己更新关系,那么我会得到这些空的 fetch 请求结果和 nil'd 关系。
我错过了什么?
【问题讨论】:
我刚刚开始按照类似的设计进行开发,并且看到了一些相同的东西。您能否确认您没有无意中在后台线程中插入任何 UI 调用?我确定您知道这会导致不良行为,而且有些不可预测。如果不是这种情况,请显示您的关系更新代码。 【参考方案1】:好的,我发现了我的问题。
我的问题是mergeChangesFromContextDidSaveNotification
将更改从一个线程合并到另一个线程的方式。正如我多次阅读的那样,它不会播放您所做的更改,而是将最终状态合并在一起。我没有意识到这件事的后果。在我的后台线程中,我正在删除一个对象,但在我删除它之前,我将它的一些关系归零,因为它们被标记为级联删除并且我不希望它们被删除。
显然,当我将那些已删除的对象合并到主上下文中时,Core Data 仍然强制执行删除规则并级联删除主上下文中的相关对象。
我更改了删除规则,现在我的关系并没有被错误地归零。不幸的是,我有一段关系,在某些情况下我想要级联删除,而在其他情况下我不想。我将不得不为此努力。
【讨论】:
那么解决办法到底是什么?以上是关于在 mergeChangesFromContextDidSaveNotification 之后 CoreData 关系为零的主要内容,如果未能解决你的问题,请参考以下文章
在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?