如何更新子管理对象上下文,使其与父项具有相同的数据?
据我所知,在储蓄时,孩子只走了一步,即父母。然而,当获取提取总是非常深入到父和持久存储。所以我希望事情会是一样的。
但事实并非如此。
我有一个托管对象上下文,它是所有其他托管对象上下文的父级。
一个孩子更改数据并保存。父母也改变了。我在父级上执行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信息。我想知道标准解决方案是什么。
答案 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可以为您节省很多痛苦,因为它将充分利用托管对象上下文的行缓存。它也只会通过孩子和父母的堆栈遍历,以满足请求。