父/子管理对象上下文如何正常工作?

时间:2015-09-12 15:22:59

标签: ios core-data concurrency merge nsmanagedobjectcontext

我的应用会定期请求我将Core Data持久存储的对象更新到网络服务。然后我需要更新我在主上下文中的对象(默认情况下在AppDelegate中提供的对象)。编辑对象的不是用户,因此我需要避免阻止UI,此外我不只是修改对象信息,而是在需要时删除和添加新对象

似乎有两个选项可以执行NSManagedObject个对象的更新:在私有队列中创建“兄弟”上下文,以及创建子上下文。阅读几篇文章,有更多人说使用父/子上下文更好(如果我错了,请纠正我),但我不完全理解这是如何工作的。我有一些关于父母/子女背景的问题:

  1. 子上下文可以在私有队列中吗?主队列中的父上下文可以吗?
  2. 我已经阅读过某些关于设置合并策略的内容,但我没有找到它的使用示例,也许没有必要在usen parent / child contexts时设置合并策略?什么时候开始?我在哪里可以找到示例或教程?
  3. 如果我将私有上下文设置为主上下文的子项,并且我保存了子私有上下文,那么私有上下文中的对象是否会“替换”主要上下文中的对象? (包括删除私有上下文中不再存在的对象和新的对象)...我的意思是......整个子上下文是否替换整个父上下文?
  4. 保存私有上下文而不是主要上下文的子项,然后清除并重新获取主上下文中的所有新数据会更好吗?
  5. 我真的需要帮助解决这个问题,提前谢谢。

1 个答案:

答案 0 :(得分:0)

  1. 是的,孩子可以在私人队列中,而父母则在主,而相反的方式也是有效的。

  2. 合并政策......

  3.   

    使用合并策略对象来解决持久存储和内存版本的托管对象之间的冲突。

    所以当你有多个直接来自persistentStoreCoordinator的上下文时,你最常使用它,可能是一个私有队列类型和一个主队列类型。

    合并政策会影响调用

    的结果

    - (void)mergeChangesFromContextDidSaveNotification:(NSNotification *)notification

    因此,如果您的删除操作是在私有队列中完成然后保存的,那么您可以通过在主要上下文中调用mergeChanges...来反映您的UI中的更改,其中包含来自 NSManagedObjectContextDidSaveNotification保存私有上下文会创建。

    1. 父上下文未被替换。简单地说,孩子所做的更改会叠加在父母身上。因此,在您的情况下,删除子对象将导致该对象在您保存子对象后删除。

    2. 没有。如果你不想使用父子情境,你最好做2中描述的事情。您所描述的是丢弃当前的主要上下文并创建一个新上下文以反映PSC的新状态。它并不可怕,但它很昂贵,如果你的UI与托管对象有任何紧密的绑定,你需要确保这些对象也被重置。它更便宜只是合并保存。

    3. 使用mergeChangesFromContextDidSaveNotification: has been measured比parent-gt; child更快地进行更改传播,但您可能会发现parent-> child在可读性方面更清晰。