4

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

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

如果我订阅 contextDidSaveNotifications,我可以使用合并上下文

[mainContext mergeChangesFromContextDidSaveNotification:syncFinishedNotification];

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

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

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

有任何想法吗?

4

1 回答 1

2

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

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

于 2013-10-28T22:15:17.083 回答