在iOS上有Core Data的一些真正奇怪的行为。CoreData关系在mergeChangesFromContextDidSaveNotification后为零
我有一个NSManagedObjectContext
为我的主线程用于从SQLLite持久存储读取数据并将其显示给用户。我也有后台进程管理的NSOperationQueue
。这些后台进程创建一个NSMangedObjectContext
,从远程服务器获取数据,并将该数据保存到本地Core Data存储。
我已经注册了NSManagedObjectContextDidSaveNotification
当我收到这些通知我打电话mergeChangesFromContextDidSaveNotification
主线程的NSManagedObjectContext
(合格通知对象作为参数)。
这都是非常标准的,所有核心数据文档都建议您处理多线程的方式。
直到最近,我一直在将新对象插入到数据存储中,而不是修改数据存储中的对象。这工作得很好。在后台线程写入新数据后,发生合并,我向UIController发送通知并重新绘制显示。显示屏绘制正确。
最近我做了一个改变,后台线程既插入又修改对象。但所有其他模式都保持不变。合并后,我的主线程NSManagedObjectContext
中的数据已损坏。如果我试图查询对象,我什么也收不回来。如果我试图检查那些我已经提到它们所有关系的对象都是零(不是故障但是零)。我已经检查过SQLLite数据库,数据都在那里。
唯一的解决方案似乎是重置NSManagedObjectContext
,鉴于该应用的架构,这是不可接受的。好吧,最后一点奇怪。如果我的后台线程只更新属性(primitves),那么我不会得到这种奇怪的行为。但是,如果我自己更新关系,那么我会得到这些空的获取请求结果并且没有关系。
我错过了什么?
我刚开始沿着类似的设计开发,看到了一些相同的东西。你能否确认你没有在后台线程中无意插入任何UI调用?我相信你知道这可能会导致不良行为,并且有点不可预测。如果情况并非如此,请显示关系更新的代码。 – Jim 2012-02-24 17:09:45