手动合并 Core Data 对象

Posted

技术标签:

【中文标题】手动合并 Core Data 对象【英文标题】:Manually merging Core Data objects 【发布时间】:2015-03-24 17:25:41 【问题描述】:

在使用 RestKit 的应用程序中,我有时会创建“相同”对象的两个实例:该应用程序可能会同时执行多个映射操作,并在其中创建一个完整对象和一个占位符,其中只有服务器分配的唯一 ID其他。这些对象是独立的 Core Data 对象,具有不同的objectIDs,尽管具有相同的serverIDs。

因为我不想显示同一个对象两次,所以我想合并这些“重复”的对象。目前我正在检查validateForInsert: 对象是否是现有对象的“重复”,如果是,则返回错误。

然后我处理所有错误,合并冲突的对象(保留最旧的),并删除重复的对象。

这是出现问题的地方,我崩溃了:我的应用程序的某些部分 - UI 或其他 - 引用了“已删除”“重复”NSObject,现在这是一个错误。由于NSManagedObject 不再存在,它被引用并且无法解决故障。

如何避免这种情况?

我真的很想避免审核对托管对象上下文的每个引用,并且必须始终检查它是否已成为错误并且应该替换为另一个我必须查找的正确NSManagedObject

【问题讨论】:

【参考方案1】:

第一个建议是不要同时运行请求。除了这个选项之外的任何事情都需要你做一些工作来进行合并(就像你现在一样)和管理引用。

如果您需要合并,那么您当前的方法是可以的。更新参考显然是一个更大的问题。你可以做得比删除最年轻的更好,但这有点无关紧要。

管理引用的最简单方法是使用NSFetchedResultsControllers,因为他们会看到添加和删除并为您更新。

如果您明确传递对托管对象的引用,那么您需要监视删除。最可能的途径是发布删除通知(或使用内置的更改通知)并删除您的引用(可能为替换执行获取请求)。

【讨论】:

以上是关于手动合并 Core Data 对象的主要内容,如果未能解决你的问题,请参考以下文章

将 `lastModified` 记录添加到 Core Data 托管对象

如何使用合并策略捕获Core Data中的错误

从现有 XSD 创建托管对象模型 - iPhone Core Data

vue源码学习--合并策略对象mergeOptions

手动编写业务对象还是使用 DAL 对象?

删除时如何手动管理Core Data关系