合并多个子托管对象上下文

时间:2013-10-28 20:43:14

标签: ios multithreading core-data merge managedobjectcontext

在我的iOS应用程序中,我尝试将核心数据与Web后端同步。我想为同步使用单独的后台管理对象上下文,这样我可以保持主上下文可以在同步处理时自由接受来自ui的更改。根据此博客文章http://www.cocoanetics.com/2012/07/multi-context-coredata/,这两个上下文都是我的磁盘写入上下文的子项。

我的问题是,在保存到磁盘之前如何合并两个子上下文?

如果我订阅了contextDidSaveNotifications,我可以使用

合并上下文
[mainContext mergeChangesFromContextDidSaveNotification:syncFinishedNotification];

但根据文件...... “此方法刷新在其他上下文中已更新的任何对象,任何新插入的对象中的错误,并在已删除的对象上调用deleteObject ::”

我不想刷新更新的对象并丢失对mainContext所做的更改,而是合并两个更改集。

我是多上下文核心数据的新手,所以我可能会以错误的方式思考这个问题。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

合并Core Data中的更改始终是在一个托管对象上下文中进行更改然后将其应用于另一个上下文的过程。如果两个上下文可能同时获取新更改,则合并将受上下文合并策略的影响。如果没有冲突的更改,则无需担心。但是,如果可能存在,则需要选择合适的合并策略。

如果不执行任何操作,则默认值为NSErrorMergePolicyType,这意味着合并更改后保存更改将失败。你几乎肯定不希望这样。但是还有其他预定义的策略可供选择。 NSMergeByPropertyObjectTrumpMergePolicyType在这里通常是一个不错的选择,因为优先考虑未保存的冲突更改。因此,如果同步上下文对用户正在编辑的对象进行了相互冲突的更改,则会保留用户的更改。还有一些其他罐头选项。如果它们都不适合,您可以始终将NSMergePolicy子类化并执行您喜欢的任何操作。但这很少是必要的。