我的设置是一个带有持久性存储协调器和SQLite持久性存储的主要moc。 我正在尝试异步(并且可能同时)从服务器检索数据,将其解析为CoreData对象,然后将这些新对象保存到持久存储中并使它们在主moc中可用。
所以我尝试了两种方法:
NSConfinementConcurrencyType
创建一个新的上下文,该上下文与主moc共享预先存储的协调器。当我完成解析JSON并拥有新的托管对象时,我保存了这个“本地”上下文,它将NSManagedObjectContextDidSaveNotification
发送到主上下文,然后进行合并。NSPrivateQueueConcurrencyType
创建子上下文。此上下文的主要上下文是父级,但没有商店协调员。然后我在子上下文中调用-performBlock:
,在那里我将JSON解析为CoreData并告诉子上下文保存,这反过来触发主要上下文合并。现在,我注意到的是方法1触发了似乎是异常的东西,但是否则有效。我这样说是因为如果我设置一个通用异常断点来中断任何Objective-C抛出,它总是在本地到GCD块上下文保存时停止。它总是一个不是主线程的线程,即使它看起来像一个异常,保存后的保存错误输出参数为零。更重要的是,主要上下文中的对象看起来是一致的(因为我知道它们应该具有的数据)。并且在任何这些对象上调用-savedChanges:
(在主要上下文合并之后)不返回任何值,这是我所期望的。
对于第二种方法,我没有在任何地方停止异常断点(这看起来不错),但是......在主要上下文合并之后正确的数据位于正确的对象中时,调用-changedValues
会返回在子上下文中填充的所有值(属性和/或关系)。这是我不希望的,因为从理论上讲,我确实保存并且保存应该被推送到主要上下文并且主要上下文合并。
所以我很困惑。
我需要-changedValues:
只返回值,如果在保存主上下文后更改了这些值,因为我使用这些值来确定我的应用程序已更改了mo的状态,并且需要将新状态推回到服务器。
我非常感谢任何方法1或2的帮助/指针。
答案 0 :(得分:1)
子上下文将保存到其父级。也就是说,一旦孩子保存了更改,这些更改就会显示在父级中,而在父级中,他们会被标记为已更改,因为父级仍需要更改这些更改。
我通常不鼓励使用父子上下文设置,因为它们有很多缺点。有关our book中使用多个上下文章节的详细信息。