仅保存在一个托管上下文中,其他托管对象上下文中没有任何更改

时间:2013-07-19 04:16:22

标签: ios core-data nsmanagedobjectcontext nsthread

我有两个托管对象上下文,比如说MMC和BMC指向同一个持久存储。分别由主线程(MT)和后台线程(BT)创建

我的所有实体中都有两个字段delta和版本号,两个上下文都在更改这些字段。

现在,BT从持久存储中获取来自Object obj1的值并将它们发布到服务器。当服务器回复时,它为obj1提供新的delta和新的修订号。

此外,当BT进入服务器时,MMC中的值正在被修改,但不会保存到持久存储中。

我想将从服务器返回的增量和修订号保存到持久存储中,但仅当 - 后台线程忙于服务器时,修订号在MMC中没有更改。

如果是这样的话,请保留MMC的delta和版本号。

我怎么可能实现这个目标?

1 个答案:

答案 0 :(得分:1)

只需保存更改,确保每个线程都在观察NSManagedObjectContextDidSaveNotification其他线程的上下文,并确保使用正确的合并策略。当后台线程保存更改时,主线程获取通知并调用mergeChangesFromContextDidSaveNotification:。然后:

  • 如果“MMC”没有变化:完成。没有其他事情发生,但如果MMC加载更新的对象,它将获得从服务器收到的值。
  • 如果“MMC”上的 更改:如果“MMC”的合并策略为NSMergeByPropertyObjectTrumpMergePolicy,则会保留MMC中未保存的更改。持久性存储具有来自服务器的值,但只要您在MMC上保存更改,MMC的值就会覆盖这些值。

因此,虽然您每次都会从服务器保存更改,但您不会丢失MMC中的任何新更改。只要您从那里保存,您就可以获得输入的任何新值。