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

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

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

[mainContext mergeChangesFromContextDidSaveNotification:syncFinishedNotification];

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

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

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

有任何想法吗?

最佳答案

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

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

关于ios - 合并多个子管理对象上下文,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19644732/

10-12 14:36
查看更多