2

我找不到任何澄清,所以它可能是一个错误。

问题是,我有一系列的父子托管对象上下文。

当我保存在子上下文中时,更改会被推送到父上下文,我可以使用普通的旧 NSFetchRequest 获取。

但是,如果我依靠 NSFetchedResultsController 将这些更改拉到同级上下文中,他们看不到它们。

调用-(void)performFetch: error;似乎也没有拉动更改。

重新启动应用程序后,所有新数据都可用。

我的假设是 NSFetchedResultsController 仅从其当前上下文中获取,并且不会跟随链到持久存储。

有人可以请我直接在这里吗?

我是否必须使用通知来监控其他上下文的变化?

最后,这是否在文档中的某处提到?我一辈子都找不到它。

4

1 回答 1

6

当您保存子上下文时,更改会传播到父上下文,但在保存根上下文(即没有父上下文)之前它们不会提交到持久存储。父上下文中的更改不会推送到其他孩子(兄弟姐妹)。

我处理这个问题的方式是将我的根上下文配置为NSMainQueueConcurrencyType,并将根上下文用于获取的结果控制器。如果您更喜欢为 FRC 使用子上下文,则在父级保存后,重置子上下文并再次执行获取。

苹果文档

文档中的相关段落是:

当您在上下文中保存更改时,更改只会“一次存储”提交。如果您保存子上下文,则会将更改推送到其父上下文。在保存根上下文之前,这些更改不会保存到持久存储中。(根托管对象上下文是其父对象为 nil 的上下文。)此外,父对象在保存之前不会从子对象中提取更改。如果要最终提交更改,则必须保存子上下文。

完整文档位于OS X v10.7 和 iOS 5.0 的 Core Data Release Notes

于 2013-06-28T01:20:49.203 回答