mergeChangesFromContextDidSaveNotification之后CoreData关系为nil

时间:2012-02-24 00:35:48

标签: iphone ios core-data nsmanagedobjectcontext

在iOS上使用Core Data有一些非常奇怪的行为。

我的主线程有NSManagedObjectContext,用于从SQLLite持久性存储中读取数据并将其显示给用户。我还有NSOperationQueue管理的后台流程。这些后台进程创建NSMangedObjectContext,从远程服务器获取数据,并将该数据保存到本地Core Data存储。

我已注册NSManagedObjectContextDidSaveNotification,当我收到这些通知时,我在主线程的mergeChangesFromContextDidSaveNotification上调用NSManagedObjectContext(将通知对象作为参数传递)。

这是非常标准的,也是所有Core Data文档建议您处理多线程的方式。

直到最近,我一直在将新对象插入数据存储中,而不是修改数据存储中的对象。这很好。在后台线程写入新数据后,合并发生,我向UIController发送通知并重绘我的显示。显示正确绘制。

最近我做了一个更改,后台线程是插入和修改对象。但所有其他模式仍然是相同的。现在合并后,主线程NSManagedObjectContext中的数据已损坏。如果我尝试查询对象,我什么也得不回来。如果我试图检查我已经拥有的对象,那么他们所有的关系都是零(不是缺点而是零)。我检查了SQLLite数据库,数据就在那里。

唯一的解决方案似乎是重置NSManagedObjectContext,考虑到应用程序的体系结构,这是不可接受的。

好的,最后一点陌生感。如果我的后台线程只更新属性(primitves),那么我不会得到这种奇怪的行为。但是,如果我自己更新关系,那么我会得到这些空的获取请求结果并且没有关系。

我错过了什么?

1 个答案:

答案 0 :(得分:3)

好的,我弄明白了我的问题。 我的问题是mergeChangesFromContextDidSaveNotification将更改从一个线程合并到另一个线程的方式。正如我多次阅读过的那样,它不会回放您所做的更改,而是将最终状态合并在一起。我没有意识到这种情况的后果。在我的后台线程中,我正在删除一个对象,但在删除它之前,我将其中的一些关系排除在外,因为它们被标记为级联删除,我不希望它们被删除。 显然,当我将这些已删除的对象合并到主上下文中时,Core Data仍然会强制执行删除规则,并且级联会删除主上下文中的相关对象。 我改变了我的删除规则,现在我的关系没有被错误地删除。不幸的是,我有一种关系,在某些情况下我想要级联删除,而在其他情况下,我没有。我将不得不继续努力。