Core data 为什么NSManagedObject ChangedValue即使在子MOC中保存更改后仍返回所有修改的属性和关系?

Core data 为什么NSManagedObject ChangedValue即使在子MOC中保存更改后仍返回所有修改的属性和关系?,core-data,ios7,nsmanagedobjectcontext,Core Data,Ios7,Nsmanagedobjectcontext,我的设置是一个主moc,带有一个持久存储协调器和一个SQLite持久存储。 我正在尝试从服务器异步(并且可能并发)检索数据,将其解析为CoreData对象,然后将这些新对象保存到持久性存储中,并使它们在主moc中可用 所以我尝试了两种方法: 每次从服务器获取时,我都会在GCD块(具有正常优先级的并发全局队列)中执行此操作,在该块中,我使用NSConfinementConcurrencyType创建一个新上下文,该上下文与主moc共享现有的存储协调器。解析完JSON并拥有新的托管对象后,我保存这个

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

所以我尝试了两种方法:

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

    对于第二种方法,我不会让异常断点停在任何地方(这似乎很好),但是。。。当主上下文合并后正确的数据位于正确的对象中时,调用
    -changedValues
    返回子上下文中填充的所有值(属性和/或关系)。这是我没有预料到的,因为理论上,我保存了,保存应该被推到主上下文,主上下文合并了

    所以我很困惑

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


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

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


    我通常不鼓励使用父子上下文设置,因为它们有很多缺点。有关更多信息,请参见。

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

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