子管理对象上下文的内容是否始终与其父级内容相同?

时间:2013-02-04 13:29:41

标签: objective-c xcode core-data nsmanagedobjectcontext

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

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

但事实并非如此。

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

一个孩子更改数据并保存。父母也改变了。我在父级上执行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.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>

这是一个更全面的版本,为什么我记下了moc,父moc,blob,URL和对象ID。 子:

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

2 个答案:

答案 0 :(得分:21)

孩子的现有参考资料无效。如果您希望兄弟姐妹在父级保存后保持同步,则必须使reset的孩子无效。

调用reset后,所有接收者的托管对象都被“遗忘”。如果使用此方法,则应确保同时丢弃​​对使用接收者获取的任何托管对象的引用,因为它们之后将无效

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

答案 1 :(得分:0)

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

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

 [child performBlock:^{
     [child save:&error];
     [parent performBlock:^{
         [parent save:&parentError];
     }];
 }];

保存子项,更改转到父项,然后保存在父项上 - 这会将所有这些更改正确地传播到其他子上下文。看看你的问题,我认为你的实现可能会遇到其他一些问题,而Session 214可能对解决它们非常有帮助。

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