2012-02-24 18 views
3

在iOS上有Core Data的一些真正奇怪的行为。CoreData关系在mergeChangesFromContextDidSaveNotification后为零

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

我已经注册了NSManagedObjectContextDidSaveNotification当我收到这些通知我打电话mergeChangesFromContextDidSaveNotification主线程的NSManagedObjectContext(合格通知对象作为参数)。

这都是非常标准的,所有核心数据文档都建议您处理多线程的方式。

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

最近我做了一个改变,后台线程既插入又修改对象。但所有其他模式都保持不变。合并后,我的主线程NSManagedObjectContext中的数据已损坏。如果我试图查询对象,我什么也收不回来。如果我试图检查那些我已经提到它们所有关系的对象都是零(不是故障但是零)。我已经检查过SQLLite数据库,数据都在那里。

唯一的解决方案似乎是重置NSManagedObjectContext,鉴于该应用的架构,这是不可接受的。好吧,最后一点奇怪。如果我的后台线程只更新属性(primitves),那么我不会得到这种奇怪的行为。但是,如果我自己更新关系,那么我会得到这些空的获取请求结果并且没有关系。

我错过了什么?

+0

我刚开始沿着类似的设计开发,看到了一些相同的东西。你能否确认你没有在后台线程中无意插入任何UI调用?我相信你知道这可能会导致不良行为,并且有点不可预测。如果情况并非如此,请显示关系更新的代码。 – Jim 2012-02-24 17:09:45

回答

3

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

+0

那么究竟是什么修复? – 2012-08-03 09:04:26