我正在开发一款使用Core Data的iPhone应用程序。该应用程序调用Web服务,解析生成的XML文件,然后在我的应用程序中创建或修改Core Data对象。我已经处理了Web服务调用和异步解析,但我一直在将解析后的数据交给主线程来操作Core Data对象。我也想在后台线程中运行这个过程。 (暂停1-2秒不能带来出色的用户体验)
显而易见的方法是专门为后台线程创建一个托管对象上下文,但后来我在Apple's Core Data Programming Guide中读到了这一行:
持久性存储协调器向其托管对象上下文提供一个虚拟存储的外观。对于完全并发的操作,您需要为每个线程使用不同的协调器。
所以这里有一个问题:您不能让两个NSPersistentStoreCoordinator
提供对同一商店的访问权限。但是,Marcus Zarra的核心数据书断言NSPersistentStoreCoordinator
是线程安全的并且会序列化I / O请求(第157页)。
有人可以为我清楚吗?是否可以在与主线程共享相同NSPersistentStoreCoordinator
的单独线程上运行第二个托管对象上下文?或者,更简洁地说,NSPersistentStoreCoordinator
是线程安全的吗?
答案 0 :(得分:17)
Zarra后来指出上下文锁定了商店,所以可以跨线程使用相同的NSPersistentStoreCoordinator 。
虽然如此 NSPersistentStoreCoordinator不是 线程安全,或 NSManagedObjectContext知道如何 在使用时将其正确锁定。 因此,我们可以附加多少 NSManagedObjectContext对象为 单个NSPersistentStoreCoordinator为 我们希望不用担心碰撞。
答案 1 :(得分:2)
是否可以在与主线程共享相同NSPersistentStoreCoordinator的单独线程上运行第二个托管对象上下文?
是的!我建议您在进入CoreData的多线程访问之前仔细阅读Zarra的相应部分。
或者,更简洁的是,NSPersistentStoreCoordinator是线程安全的吗?
嗯,“线程安全”这个词在Apple文档中有含义,所以要非常小心! 请参阅此blog article以获得一个很好的解释。