NSManagedObjectContext - 如何将childcontext数据与parentcontext数据相关联?

时间:2013-11-25 01:27:55

标签: ios concurrency nsmanagedobjectcontext

关于以下场景,我对孩子MOC(NSPrivateQueueConcurrencyType)如何与父MOC(NSMainQueueConcurrencyType)合作感到困惑。我需要有一个后台线程检查Web服务器以获取新的或更新的数据。收到某些内容后,我需要保存或更新父MOC。听起来很简单,我看到了各种各样的例子。但是,我仍然对一些事情感到困惑。

在后台线程中处理数据时,我可以轻松地将对象保存在子MOC中。但是,在我的数据模型中,我按照建议设置了关系。因此,例如,ConversationThread将包含一个Messages数组。每条Message都会在关系中设置Message.parentConvoThread。所以,每当我从服务器收到新消息时......

  1. 如何将在子privateMOC中创建的新Message对象与ConversationThread(当前位于父mainMOC中)相关联?
  2. 现在,请说我正在为撰写邮件的人获取更新的个人信息。我看到他们已经更新了服务器上的数据,所以我需要在应用程序中更新他们的数据。在privateMOC ......

    1. 如何从mainMOC获取实际对象(比如它的MyContact)以明确更新?或者......
    2. 如果我在privateMOC中创建一个新的MyContact,如何将其与mainMOC中当前存在的MyContact合并? ......还是以某种方式自动发生? (< - 我已经读过许多旧线程,说你使用NSManagedObjectDidChangeNotification并手动合并,但这不再是必要了......但是如何/为什么?)
    3. 最后,关于搜索的几个问题......

      1. 针对子privateMOC的搜索是否可以从父mainMOC返回结果(比如父实体中是否存在实体而不是子实体)?
      2. 如果对#1的答案为真,那么如果实体存在于两者中但尚未合并会发生什么?
      3. 我对他们如何一起工作很困惑。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

NSManagedObjectContexts位于来自NSPersistentStore的数据的内存缓存中。子上下文的提取将通过NSPersistentStore上的父上下文执行,并且来自对象的数据将从子上下文中的高速缓存,父上下文或从持久性存储中的所有方式检索(无论何处它可以先找到数据。)

如果从子上下文中获取,将通过父上下文检索结果,并且您可以期望此获取请求返回对象,就像从父上下文中获取一样。

转到另一个方向,只要您保存了对子上下文所做的所有更改,这些更改将反映在父上下文中,因为核心数据会自动处理从子级到父级的合并。

唯一的技巧是,如果您在子上下文中引用了对象,并且更改在后台保存到父上下文,您将需要在子上下文中重新获取这些对象以从父上下文中获取更改,或者您可以手动合并父项NSManagedObjectContextDidSaveNotification上的更改。有关详情,请参阅此帖子:How to keep a child NSManagedObjectContext up to date when using bindings