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.
保存后与提取不一致
我的 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.
保存后与提取不一致