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

an0*_*an0 2 core-data ios

看起来基于MOC的新队列与iOS 5中引入的嵌套MOC一起作为一种更简单,更清晰的并发模型,所以我现在很乐意使用它.但有几件事我不清楚:

  1. 儿童MOC会自动提取父母MOC的变化吗?或者我还需要手动协调它们吗?如果是后者,如何手动刷新子项以包含父更改?(我知道事情的相反方式 - 当孩子保存时,父MOC会从子MOC获得更改.)
  2. 如果儿童的变化与父母的变化之间存在冲突,保存儿童MOC会发生什么?是否mergePolicy还负责解决孩子MOC和家长建设部之间的冲突?

Jod*_*ins 5

  1. 是和否,取决于您对"拉动parentMOCs自动更改"的定义.如果您的意思是,下次儿童取出时,它将获得更新的数据,然后是.如果你的意思是对象会自动改变,那么没有.原因是MOC是一个暂存器,如果不改变它就不会改变.

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

编辑

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

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

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

  1. mergePolicy在这里工作吗?

是.

同样,我可以在这里给你的最佳答案是指向你的"核心数据编程指南".特别注意这两个部分:

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