Child 保存后 NSManagedObjectContext 不一致 NSFetchedResultsController 结果

Child NSManagedObjectContext inconsistent NSFetchedResultsController results after saving

我的 NSFetchedResultsController 发生了一个非常奇怪的..问题。

我的设置是使用 Magical Record,我有一个 child,parent 设置为 MR_defaultContext ([NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_defaultContext]])。

我使用第一个视图控制器的 managedObjectContext 作为 parent 创建了一个嵌套上下文,将其用于下一页,这是模态的。下一页使用谓词执行提取,很简单,找到 to-many 关系中的所有实体。

现在,如果我在推送到下一个模式页面之前不保存插入的实体,则提取是正确的。但是.. 如果我用 [self.managedObjectContext MR_saveOnlySelfWithCompletion] 保存然后推送,提取有时是正确的,有时(大多数时候)是随机的和不正确的。例如有 5 entities 它应该被抓取,但它抓取 1、3、4,有时 none。很奇怪!

更奇怪的是,我将实体数作为模态页面中的一个变量,它正确显示了 5。总是。如果我打印出 to-many 关系的 parent 实体,它确实设置了所有 5 个关系(并且反向设置也正确)。

我读过有关在保存之前获取永久 IDS 的信息,但这并没有什么不同。

有人知道这是怎么回事吗?

我想您的问题可能是由于您在 MR_saveOnlySelfWithCompletion 完成之前移动到下一个模式页面。

尝试从传递给该方法的完成块中推送下一个模态,一切都应该正常。

好吧,我在想 child/parent 关系错了。看了WWDC 2012的Core Data Best Practices,整理了一下是怎么回事。

我最初认为 child 需要保存才能访问 parent 更改。事实证明这不是真的——在 segue 之前保存对于 child 上下文访问 parent 上下文中的更改是不必要的。所以删除保存将不得不做,因为它不需要。

顺便说一句,我使用 existingObjectWithID 从下一个模态页面获取 object,这是不必要的,因为来自 parent 上下文的更改可用于child。我不是 100% 确定为什么 object 不会被这种方法获取,因为文档指出 If there is a managed object with the given ID already registered in the context, that object is returned directly 在我看来应该是这样。

另外 - 在推送到模式后(在获取之前)从 child 保存上下文工作得很好..

仍然不确定为什么从 parent VC.

保存后与提取不一致