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

时间:2012-06-03 21:45:11

标签: ios core-data

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

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

1 个答案:

答案 0 :(得分:5)

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

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

  3. 修改

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

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

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

      
        
    1. mergePolicy在这里工作吗?
    2.   

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

    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