Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 仅在另一个托管对象上下文中没有更改的情况下保存在一个托管上下文中_Ios_Core Data_Nsmanagedobjectcontext_Nsthread - Fatal编程技术网

Ios 仅在另一个托管对象上下文中没有更改的情况下保存在一个托管上下文中

Ios 仅在另一个托管对象上下文中没有更改的情况下保存在一个托管上下文中,ios,core-data,nsmanagedobjectcontext,nsthread,Ios,Core Data,Nsmanagedobjectcontext,Nsthread,我有两个托管对象上下文,比如MMC和BMC指向同一个持久存储。分别由主线程(MT)和后台线程(BT)创建 所有“我的实体”中都有两个字段“增量”和“修订号”,这两个字段都会被上下文更改 现在,BT从持久存储中获取对象obj1的值,并将其发布到服务器。当服务器回复时,它为obj1提供一个新的增量和一个新的修订号 此外,当BT进入服务器时,MMC中的值正在被修改,但并没有保存到持久存储中 我想将从服务器返回的增量和修订号保存到持久性存储中,但前提是——当后台线程忙于访问服务器时,MMC中的修订号没有

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

所有“我的实体”中都有两个字段“增量”和“修订号”,这两个字段都会被上下文更改

现在,BT从持久存储中获取对象obj1的值,并将其发布到服务器。当服务器回复时,它为obj1提供一个新的增量和一个新的修订号

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

我想将从服务器返回的增量和修订号保存到持久性存储中,但前提是——当后台线程忙于访问服务器时,MMC中的修订号没有更改

如果是,我想保留MMC的增量和修订号


我怎么可能做到这一点

只需保存更改,确保每个线程都在观察另一个线程的上下文,并确保使用正确的合并策略。当后台线程保存更改时,主线程会收到通知并从ContextDidSaveNotification:调用
mergeChangesFromContextDidSaveNotification:
。然后:

  • 如果“MMC”上没有更改:完成。没有其他事情发生,但如果MMC加载了更新的对象,它会从服务器接收到值
  • 如果“MMC”上有更改:如果“MMC”的合并策略是
    NSMergeByPropertyObject TrumpMergePolicy
    ,则会保留MMC中未保存的更改。持久存储具有来自服务器的值,但一旦您在MMC上保存更改,MMC的值就会覆盖这些值

因此,尽管每次都会从服务器保存更改,但不会丢失MMC中的任何新更改。一旦从那里保存,就会得到输入的任何新值。

只需保存更改,确保每个线程都在观察另一个线程上下文的NSManagedObjectContextDidSaveNotification,并确保使用正确的合并策略。当后台线程保存更改时,主线程会收到通知并从ContextDidSaveNotification:调用
mergeChangesFromContextDidSaveNotification:
。然后:

  • 如果“MMC”上没有更改:完成。没有其他事情发生,但如果MMC加载了更新的对象,它会从服务器接收到值
  • 如果“MMC”上有更改:如果“MMC”的合并策略是
    NSMergeByPropertyObject TrumpMergePolicy
    ,则会保留MMC中未保存的更改。持久存储具有来自服务器的值,但一旦您在MMC上保存更改,MMC的值就会覆盖这些值
因此,尽管每次都会从服务器保存更改,但不会丢失MMC中的任何新更改。一旦从那里保存,就可以得到输入的任何新值