iphone - mergeChangesFromContextDidSaveNotification 后 CoreData 关系为零

标签 iphone ios core-data nsmanagedobjectcontext

iOS 上的 Core Data 有一些真正奇怪的行为。

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

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

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

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

最近做了一个改动,后台线程既是插入又是修改对象。但是所有其余的模式都保持不变。现在合并后,我主线程的 NSManagedObjectContext 中的数据已损坏。如果我尝试查询对象,我将一无所获。如果我尝试检查我已经引用了它们所有关系的对象,则为 nil(不是故障而是 nil)。我检查了 SQLLite 数据库,数据都在那里。

唯一的解决方案似乎是重置 NSManagedObjectContext,考虑到应用程序的架构,这是 Not Acceptable 。

好吧,最后一点奇怪。如果我的后台线程只更新属性(基元),那么我不会得到这种奇怪的行为。但是,如果我自己更新关系,那么我会得到这些空的提取请求结果和 nil'd out 关系。

我错过了什么?

最佳答案

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

关于iphone - mergeChangesFromContextDidSaveNotification 后 CoreData 关系为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9423696/

相关文章:

objective-c - 通过 Coregraphic : crash at renderInContext 画线

iphone - 从 NonJailbreakeniPhone 获取通话记录详细信息

ios - Unity iOS 背景音频变得静音

ios - 不遵守使用 ScrollView 的 Storyboard约束

ios - MFMailComposeViewController 的自定义 UINavigationBar

ios - moveRowAtIndexPath - 将订单号保存到核心数据 block UI

iphone - NSPredicate 表达式中 SUBQUERY 的快速解释

iphone - objc_setAssociatedObject 在 iPhone 模拟器中不可用

swift - 如何允许用户仅打开以编程方式构建的单个 uiSwitch 并存储开关的数据

ios - 将 componentsseparatedbystring 添加到具有核心数据的谓词中