我的NSFetchedResultsController发生了一个非常奇怪的问题。
我的设置是使用魔法记录,我有一个孩子,父母设置为MR_defaultContext
([NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_defaultContext]]
)。
我使用第一个视图控制器的managedObjectContext
作为父级创建嵌套上下文,将其用于下一页,即模态。下一页使用谓词执行提取,简单,查找多对多关系中的所有实体。
现在,如果我在推送到下一个模态页面之前没有保存插入的实体,则提取是正确的。但是..如果我用[self.managedObjectContext MR_saveOnlySelfWithCompletion]
保存然后推送,则提取有时是正确的,有时(大多数情况下)随机且不正确。例如,它应该取5 entities
,但它取1,3或4,有时不取。很奇怪!
更奇怪的是,我将实体数量保留为模态页面中的变量,正确显示5。总是。如果我打印出to-many关系的父实体,它确实设置了所有5个关系(并且反转也正确设置)。
我已经阅读过关于在保存之前获取永久IDS的信息,但这并没有什么区别。
任何人都知道发生了什么事?
答案 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的不一致。