1

我的设置是一个具有持久存储协调器和 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,我真的很感激任何帮助/指示。

4

1 回答 1

1

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

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

于 2015-12-18T17:02:40.287 回答