兄弟 NSManagedObjectContexts 如何交互?

Posted

技术标签:

【中文标题】兄弟 NSManagedObjectContexts 如何交互?【英文标题】:How do sibling NSManagedObjectContexts interact? 【发布时间】:2013-06-18 13:41:22 【问题描述】:

如果我有 3 个 NSManagedObjectContexts。

A.是根上下文。

B.是一个后台保存上下文,解析一个 JSON 后生成 NSManagedObjects

C.是在 NSFetchedResultsController 中使用的子上下文

布局是这样的

  A
 / \
B   C

当我在 B 中进行更改时,我告诉 B 保存,然后我告诉 B.parent 保存。我的想法是它会触发 C 向我的 UITableView 发送更新,它支持它。

我的理论正确吗?还是我需要做其他事情才能让 C 看到来自 A 的更新。我希望所做的更改能够弹出到 tableview 中。

具体来说,我试图了解这些孩子如何响应其父上下文中的变化以及这如何导致 NSFetchedResultsController 触发更新。

【问题讨论】:

【参考方案1】:

由于保存只会将更改向上推送一级,因此 managedObjectContext 的子级只有在您再次获取时才会获得对其父级上下文所做的更改。

有关嵌套上下文如何工作的更多信息,请查看来自 WWDC 2011 的视频 What's New in Core Data for ios

无论如何,在您的示例中,如果 A 正在数据库中写入和读取,而 B 则为什么不让 C 成为 B 的孩子?这样,保存 C 也会更新 UI,而保存 B 将推送更改并将它们排队等待保存。

【讨论】:

问题在于我的 Sync 现在依赖于 viewController,除非我误解了你,否则这是个坏主意。如果我错了,你能解释一下吗? 没关系,我把信弄反了。我的新问题是,Parent(B) 如何通知 C 有新的更改要拉?这是自动的吗?我需要收听此通知吗? 不,它不是自动的。您应该收听父级发送的NSManagedObjectContextDidSaveNotification 或观察它的-hasChanges 属性。如果您选择观察有变化,请注意不要触摸父上下文,而只需在子级上调用-executeFetchRequest:error: 您也可以告诉 C 自动合并来自父级的更改。迅速c.automaticallyMergesChangesFromParent = true。然后,您对 B 所做的任何更改都将自动推送到 C。但是,如果您想将 B 用作暂存器(创建一个您可能稍后在用户取消时删除的对象),C 将接受这些更改。跨度>

以上是关于兄弟 NSManagedObjectContexts 如何交互?的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObjectContext:撤消保存操作?

声明 NSManagedObjectContext 时出错

CoreData 多 NSManagedObjectContext 保存通知说明

NSManagedObjectContext 类别

NSManagedObjectContext: performBlockAndWait vs performBlock 通知中心

如何清除 NSManagedObjectContext 中的所有对象?