【问题标题】:why does NSManagedObject changedValues return all modified attributes and relationships even after saving changes in child MOC?为什么 NSManagedObject changedValues 即使在子 MOC 中保存更改后也会返回所有修改的属性和关系?
【发布时间】:2013-11-07 22:18:36
【问题描述】:

我的设置是一个具有持久存储协调器和 SQLite 持久存储的主要 moc。 我正在尝试异步(并且可能同时)从服务器检索数据,将其解析为 CoreData 对象,然后将这些新对象保存到持久存储中,并在主 moc 中提供它们。

所以我尝试了两种方法:

  1. 每次从服务器获取数据时,我都会在 GCD 块(具有正常优先级的并发全局队列)中执行此操作,在该块中我使用 NSConfinementConcurrencyType 创建一个新上下文,该上下文与主 moc 共享持久存储协调器。当我解析完 JSON 并拥有新的托管对象后,我保存了这个“本地”上下文,它将 NSManagedObjectContextDidSaveNotification 发送到主上下文,然后进行合并。
  2. 每次从服务器获取数据时,我都不会调度 GCD 块,而是使用NSPrivateQueueConcurrencyType 创建一个子上下文。此上下文具有作为父上下文的主要上下文,但没有存储协调器。然后我在子上下文上调用-performBlock:,将 JSON 解析为 CoreData 并告诉子上下文保存,这反过来又触发主上下文合并。

现在,我注意到方法 1 触发了看似异常但其他情况下有效的情况。我这样说是因为如果我设置一个通用异常断点来在任何 Objective-C 抛出时中断,它总是在本地到 GCD 块上下文保存时停止。它始终是主线程之外的线程,即使它看起来像一个异常,保存错误输出参数在保存后为零。更重要的是,主要上下文中的对象似乎是一致的(因为我知道它们应该拥有的数据)。并且在任何这些对象上调用-savedChanges:(在主上下文合并之后)不会返回任何值,这是我所期望的。

对于第二种方法,我没有让异常断点在任何地方停止(这看起来不错),但是......虽然正确的数据在主上下文合并后位于正确的对象中,但调用 -changedValues 会返回所有在子上下文中填充的值(属性和/或关系)。这是我没想到的,因为理论上我确实保存了,并且保存应该已经被推送到主上下文并且主上下文确实合并了。

所以我很困惑。

我需要-changedValues: 仅在保存主上下文后更改这些值时才返回值,因为我使用这些值来确定我的应用程序已经更改了 mo 的状态并且需要将新状态推送回服务器.

我非常感谢任何方法 1 或 2 的帮助/指示。

【问题讨论】:

    标签: core-data ios7 nsmanagedobjectcontext


    【解决方案1】:

    子上下文保存其父上下文。也就是说,一旦子级保存了其更改,这些更改就会出现在父级中,并且在父级中它们被标记为已更改,因为父级仍然需要更改这些。

    我通常不鼓励使用父子上下文设置,因为它们有很多缺点。更多信息请参阅our book 中的使用多个上下文一章。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-14
      • 2013-08-26
      • 2021-06-20
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2022-09-25
      • 1970-01-01
      相关资源
      最近更新 更多