如何让子 MOC 看到父 MOC 的变化以及如何解决它们之间的冲突?

Posted

技术标签:

【中文标题】如何让子 MOC 看到父 MOC 的变化以及如何解决它们之间的冲突?【英文标题】:How to make child MOC see changes of parent MOC and how to resolve conflicts between them? 【发布时间】:2012-06-03 21:45:11 【问题描述】:

似乎新的基于队列的 MOC 与 ios 5 中引入的嵌套 MOC 一起作为一个更简单和更清洁的并发模型,所以我现在很高兴地使用它。但是有几件事我不清楚:

    子 MOC 会自动拉取父 MOC 的更改吗?还是我还需要手动协调它们?如果是后者,如何手动刷新子项以合并父项更改? (我知道事情是如何反过来的——当孩子保存时,父 MOC 会从子 MOC 获得更改。) 如果子项更改和父项更改之间存在冲突,保存子 MOC 会发生什么情况? mergePolicy 是否也负责解决子 MOC 和父 MOC 之间的冲突?

【问题讨论】:

【参考方案1】:

    是和否,取决于您对“自动拉取 parentMOC 更改”的定义。如果您的意思是,下一次孩子获取时,它将获得更新的数据,那么是的。如果您的意思是对象会自动更改,那么不会。原因是 MOC 是一个便签本,你不改变它就不会改变。

    是的,如果您要从多个位置更改相同的对象/关系,则必须解决合并冲突。这是一个复杂的问题,在 SO 答案中无法充分回答。你真的应该阅读核心数据编程指南,尤其是关于变更管理的部分。

编辑

    假设我在子 MOC 中持有对象 A,并在父 MOC 中添加关系 B 到 A。如果我访问 A.B,我会得到什么?零?如果我该怎么办 我想在儿童 MOC 中看到 A.B?使用 refreshObject:mergeChanges: 来 刷新 A,还是使用 objectWithID: 再次获取 A?有没有办法 刷新整个子MOC?我有一个非常复杂的对象网络 孩子 MOC,我不想(或只是不能)刷新/重新获取每个 一个一个的对象。

通过子 MOC 查看对象 A 时,在从子 MOC 重新获取之前,您不会看到父 MOC 中的更改。如果您想查看父项中的内容,可以通过 MOC 上的另一个 fetch 或通过任何方法从存储中获取特定对象来实现。但是,我必须强调您需要阅读有关每次提取的文档,因为它们可能有副作用。确切的答案取决于您选择哪种方法。

通常,如果您正在进行持续更改,您希望在子项中进行更改并将其推送给父项,或者处理 DidChange 通知以使更改看起来“自动”。

    mergePolicy 在这里有效吗?

是的。

再一次,我可以在这里给你的关于 SO 的最佳答案是向你指出“核心数据编程指南”。请特别注意这两个部分:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdFetching.html#//apple_ref/doc/uid/TP40002484-SW1

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdChangeManagement.html#//apple_ref/doc/uid/TP30001201-CJBDBHCB

【讨论】:

1.假设我在子 MOC 中持有对象 A,并在父 MOC 中添加关系 B 到 A。如果我访问 A.B,我会得到什么?零?如果我想在儿童 MOC 中看到 A.B,我该怎么办?使用refreshObject:mergeChanges:刷新A,还是使用objectWithID:再次获取A?有没有办法刷新整个孩子MOC?我在子 MOC 中有一个非常复杂的对象网络,我不想(或不能)一个一个地刷新/重新获取每个对象。

以上是关于如何让子 MOC 看到父 MOC 的变化以及如何解决它们之间的冲突?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决VS+Qt不生成moc文件问题

父 MOC 使用来自子 MOC 的空数据获取更改

如何手动将 Qt .rep 复制到 .h,然后将它们 moc 到 .cpp

如何在 qmake 项目中向 moc 添加特定标志?

保存父 NSManagedObjectContext 时出错

获取时子 Moc 没有获得最近的更改