Objective c 子托管对象上下文的内容是否始终与它的内容相同';谁的父母?

Objective c 子托管对象上下文的内容是否始终与它的内容相同';谁的父母?,objective-c,xcode,core-data,nsmanagedobjectcontext,Objective C,Xcode,Core Data,Nsmanagedobjectcontext,如何更新子托管对象上下文,使其与父对象具有相同的数据 据我所知,在储蓄时,孩子只走了一步,即父母。然而,在获取数据时,总是深入到父存储和持久存储。所以我希望事情会是一样的 但事实并非如此 我有一个托管对象上下文,它是所有其他托管对象上下文的父级 一个子项更改数据并保存。父项也会更改。我对父对象执行了executeFetchRequest,我看到数据发生了更改 然而,一些父母的孩子仍然使用旧数据。相同的对象id相同的数据。不知何故,财产的价值保持不变 如何告诉子级从父级重新加载新数据 更确切地说

如何更新子托管对象上下文,使其与父对象具有相同的数据

据我所知,在储蓄时,孩子只走了一步,即父母。然而,在获取数据时,总是深入到父存储和持久存储。所以我希望事情会是一样的

但事实并非如此

我有一个托管对象上下文,它是所有其他托管对象上下文的父级

一个子项更改数据并保存。父项也会更改。我对父对象执行了executeFetchRequest,我看到数据发生了更改

然而,一些父母的孩子仍然使用旧数据。相同的对象id相同的数据。不知何故,财产的价值保持不变

如何告诉子级从父级重新加载新数据

更确切地说

假设p是父母

说它小时候有C1,C2,C3

然后C1更改数据并提交。更改被传播到P。但是,在C2和C3执行executeFetchRequest时仍然显示旧数据

有什么好处

例如,当我检查imageBlob属性时,我得到的是:

儿童:

2013-02-05 13:57:42.865 BadgerNew[78801:c07] imageBlob: <UIImage: 0x89c3c50>
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null>
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null>
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null>
2013-02-05 13:57:42.865獾新[78801:c07]图像块:
2013-02-05 13:57:42.866獾新[78801:c07]图像块:
2013-02-05 13:57:42.866獾新[78801:c07]图像块:
2013-02-05 13:57:42.866獾新[78801:c07]图像块:
家长:

2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x114af650>
2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x8e492e0>
2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x114c79b0>
2013-02-05 13:57:42.869 BadgerNew[78801:c07] imageBlob: <UIImage: 0xa8c76e0>
2013-02-05 13:57:42.868獾新[78801:c07]图像块:
2013-02-05 13:57:42.868獾新[78801:c07]图像块:
2013-02-05 13:57:42.868獾新[78801:c07]图像块:
2013-02-05 13:57:42.869獾新[78801:c07]图像块:
下面是一个更全面的版本,为什么我要记下moc、父moc、blob、URL和对象ID。 儿童:


特别是,我希望mainqueue managedobject上下文是父对象的另一个子对象,而不是所有其他managedobject上下文的父对象。另一方面,我还希望mainQueue托管对象上下文具有最新信息。我想知道标准的解决方案是什么。

孩子有无效的现有引用。如果要在父级保存后使同级同步,则必须使用
重置
使子级无效

调用重置后,所有接收方的托管对象都将被“遗忘”。如果使用此方法,则应确保也放弃对使用接收方获取的任何托管对象的引用,因为它们随后将无效


保存父上下文时,如果希望对子上下文中已更改的对象进行更精细的控制,还可以对所有子上下文中已更改的单个对象使用
refreshObject:mergeChanges:

实际上有很多关于如何正确执行此操作的文档,包括2011年和2012年的WWDC会话视频。2012年第214次会议“核心数据最佳实践”对您来说尤其有趣

例如,对于您的保存,它应该如下所示:

 [child performBlock:^{
     [child save:&error];
     [parent performBlock:^{
         [parent save:&parentError];
     }];
 }];
这将保存子项,更改将转到父项,然后保存到父项上—这将正确地将所有这些更改传播到其他子上下文。考虑到您的问题,我认为您可能会在实现过程中遇到一些其他问题,而会话214可能对解决这些问题非常有帮助


至于重置上下文,我不建议在使用父子上下文时这样做。我也会避免使用
refreshObject:mergeChanges:
。为此目的使用objectWithID可能会为您省去很多麻烦,因为它将充分利用托管对象上下文的行缓存。它还将只遍历需要遍历的子级和父级堆栈以满足请求。

而使用reset是正确的,这有点过分了。我正在寻找其他解决方案。我添加了在上下文中更新单个managedobjects的方法。布拉沃:)我实际使用了这个方法。享受赏金:)呃,有人知道为什么这个问题被否决了吗?我确实选择了这个作为正确答案,对吗?希望确保您获得赏金。+1表示我应该在[child performBlock]中调用[parent performBlock],在保存父上下文时,父上下文中的更改不会传播到子上下文。以下是Marcus Zarra在《核心数据》第二版中引用的一句话:“需要注意的是,虽然这些更改将被推到父上下文中,但它们不会被推到任何现有的子项中。最好将现有的子项视为在创建子项时获取的数据的“快照”。@quellish我很抱歉,但是你错了。子对象确实会从父对象继承未保存的更改,但如果子对象已从错误中填充该对象,则在创建子上下文后对父对象所做的任何更改对子对象都不可见。如果对象出现故障,它将从父上下文中提取并可见。@quellish是的,如果触发故障,它将从父对象中执行,并在必要时一直执行到持久存储,就像您所说的那样。但是如果对象已经存在于子上下文中,并且对父对象进行了更改,则需要显式合并这些更改,以使它们在子上下文中可用。@SaadMasood答案和后面的注释都会误导您,从而解决问题所引发的问题,这就是如何从父上下文刷新子上下文中的数据。答案的第一部分,参考了关于如何将子上下文中的更改合并到父上下文中的核心数据最佳实践,但是这是正确的。哇,我投了50票,得到了5票,因此,我得到了10分:)