【发布时间】:2013-11-07 22:18:36
【问题描述】:
我的设置是一个具有持久存储协调器和 SQLite 持久存储的主要 moc。 我正在尝试异步(并且可能同时)从服务器检索数据,将其解析为 CoreData 对象,然后将这些新对象保存到持久存储中,并在主 moc 中提供它们。
所以我尝试了两种方法:
- 每次从服务器获取数据时,我都会在 GCD 块(具有正常优先级的并发全局队列)中执行此操作,在该块中我使用
NSConfinementConcurrencyType创建一个新上下文,该上下文与主 moc 共享持久存储协调器。当我解析完 JSON 并拥有新的托管对象后,我保存了这个“本地”上下文,它将NSManagedObjectContextDidSaveNotification发送到主上下文,然后进行合并。 - 每次从服务器获取数据时,我都不会调度 GCD 块,而是使用
NSPrivateQueueConcurrencyType创建一个子上下文。此上下文具有作为父上下文的主要上下文,但没有存储协调器。然后我在子上下文上调用-performBlock:,将 JSON 解析为 CoreData 并告诉子上下文保存,这反过来又触发主上下文合并。
现在,我注意到方法 1 触发了看似异常但其他情况下有效的情况。我这样说是因为如果我设置一个通用异常断点来在任何 Objective-C 抛出时中断,它总是在本地到 GCD 块上下文保存时停止。它始终是主线程之外的线程,即使它看起来像一个异常,保存错误输出参数在保存后为零。更重要的是,主要上下文中的对象似乎是一致的(因为我知道它们应该拥有的数据)。并且在任何这些对象上调用-savedChanges:(在主上下文合并之后)不会返回任何值,这是我所期望的。
对于第二种方法,我没有让异常断点在任何地方停止(这看起来不错),但是......虽然正确的数据在主上下文合并后位于正确的对象中,但调用 -changedValues 会返回所有在子上下文中填充的值(属性和/或关系)。这是我没想到的,因为理论上我确实保存了,并且保存应该已经被推送到主上下文并且主上下文确实合并了。
所以我很困惑。
我需要-changedValues: 仅在保存主上下文后更改这些值时才返回值,因为我使用这些值来确定我的应用程序已经更改了 mo 的状态并且需要将新状态推送回服务器.
我非常感谢任何方法 1 或 2 的帮助/指示。
【问题讨论】:
标签: core-data ios7 nsmanagedobjectcontext