【问题标题】:NSManagedObjectContext - How to associate childcontext data with parentcontext data?NSManagedObjectContext - 如何将子上下文数据与父上下文数据相关联?
【发布时间】:2013-11-25 01:27:54
【问题描述】:

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

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

  1. 如何将在子 privateMOC 中创建的新 Message 对象与 ConversationThread(当前在父 mainMOC 中)关联?

现在,假设我正在获取消息撰写人的更新个人信息。我看到他们已经更新了服务器上的数据,所以我需要在 app 中更新他们的数据。在私人MOC...

  1. 如何从 mainMOC 获取实际对象(比如 MyContact)以显式更新?或者...
  2. 如果我在 privateMOC 中创建一个新的 MyContact,如何将它与 mainMOC 中当前存在的 MyContact 合并? ...或者它会以某种方式自动发生吗? (

最后,关于搜索的几个问题...

  1. 对子 privateMOC 的搜索能否从父 mainMOC 中返回结果(例如,如果实体存在于父中但子中不存在)?
  2. 如果#1 的答案为真,如果实体存在于两者中但尚未合并,会发生什么情况?

我对它们如何协同工作感到很困惑。非常感谢任何帮助。

【问题讨论】:

  • 认为我现在已经想通了。我将根据我上面的建议发言。当您将 privateMOC 设置为 mainMOC 的子对象时,它会出现,并且您对子 MOC 执行 fetch 它将从 mainMOC 返回结果,但上下文将作为子 MOC “更改”(或出现)。因此,即使实体实际上存储在 mainMOC 中,您也可以在使用它时进行关联并将其视为 privateMOC 的一部分。你们 NSManagedObjectContext 大师……这是正确的吗?
  • 谁对这个问题投了反对票,请解释一下原因?

标签: ios concurrency nsmanagedobjectcontext


【解决方案1】:

NSManagedObjectContexts 位于 NSPersistentStore 数据的内存缓存中。对子上下文的获取将通过 NSPersistentStore 上的父上下文执行,并且来自对象的数据将从子上下文中的缓存、父上下文或一直从持久存储中检索(无论它在哪里可以先找到数据)。

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

反过来说,只要您对子上下文所做的所有更改都已保存,这些更改就会反映在父上下文中,因为核心数据会自动处理从子上下文到父上下文的合并。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2013-02-08
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    相关资源
    最近更新 更多