保存

时间:2015-06-05 09:21:16

标签: ios objective-c core-data nsfetchedresultscontroller

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

我的设置是使用魔法记录,我有一个孩子,父母设置为MR_defaultContext[NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_defaultContext]])。

我使用第一个视图控制器的managedObjectContext作为父级创建嵌套上下文,将其用于下一页,即模态。下一页使用谓词执行提取,简单,查找多对多关系中的所有实体。

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

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

我已经阅读过关于在保存之前获取永久IDS的信息,但这并没有什么区别。

任何人都知道发生了什么事?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

好的,我在想孩子/父母的关系是错的。我观看了WWDC 2012的核心数据最佳实践,并整理了正在发生的事情。

我最初认为保存对于孩子能够访问父改变是必要的。事实证明这不是真的 - 在子上下文之前保存是不必要的,以便子上下文访问父上下文的更改。因此,删除保存必须执行,因为不需要。

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

另外另外一点 - 在推送到模态之后(在获取之前)保存孩子的上下文工作正常......

仍然不确定为什么在从父VC保存后与fetch的不一致。