为什么即使在保存子MOC中的更改后,NSManagedObject changedValues也会返回所有已修改的属性和关系?

时间:2013-10-28 23:08:22

标签: core-data ios7 nsmanagedobjectcontext

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

所以我尝试了两种方法:

  1. 每次从服务器获取时,我都会在GCD块(具有正常优先级的并发全局队列)中执行此操作,其中我使用NSConfinementConcurrencyType创建一个新的上下文,该上下文与主moc共享预先存储的协调器。当我完成解析JSON并拥有新的托管对象时,我保存了这个“本地”上下文,它将NSManagedObjectContextDidSaveNotification发送到主上下文,然后进行合并。
  2. 每次从服务器获取时,我都不会调度GCD块,而是使用NSPrivateQueueConcurrencyType创建子上下文。此上下文的主要上下文是父级,但没有商店协调员。然后我在子上下文中调用-performBlock:,在那里我将JSON解析为CoreData并告诉子上下文保存,这反过来触发主要上下文合并。
  3. 现在,我注意到的是方法1触发了似乎是异常的东西,但是否则有效。我这样说是因为如果我设置一个通用异常断点来中断任何Objective-C抛出,它总是在本地到GCD块上下文保存时停止。它总是一个不是主线程的线程,即使它看起来像一个异常,保存后的保存错误输出参数为零。更重要的是,主要上下文中的对象看起来是一致的(因为我知道它们应该具有的数据)。并且在任何这些对象上调用-savedChanges:(在主要上下文合并之后)不返回任何值,这是我所期望的。

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

    所以我很困惑。

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

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

1 个答案:

答案 0 :(得分:1)

子上下文将保存到其父级。也就是说,一旦孩子保存了更改,这些更改就会显示在父级中,而在父级中,他们会被标记为已更改,因为父级仍需要更改这些更改。

我通常不鼓励使用父子上下文设置,因为它们有很多缺点。有关our book使用多个上下文章节的详细信息。