2

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

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

1 回答 1

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

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

编辑

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

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

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

  1. 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

于 2012-06-04T02:02:47.110 回答