NSPersistentStoreCoordinator线程安全吗?

时间:2009-12-29 18:13:53

标签: iphone cocoa cocoa-touch core-data

我正在开发一款使用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是线程安全的吗?

2 个答案:

答案 0 :(得分:17)

Zarra后来指出上下文锁定了商店,所以可以跨线程使用相同的NSPersistentStoreCoordinator

  虽然如此   NSPersistentStoreCoordinator不是   线程安全,或   NSManagedObjectContext知道如何   在使用时将其正确锁定。   因此,我们可以附加多少   NSManagedObjectContext对象为   单个NSPersistentStoreCoordinator为   我们希望不用担心碰撞。

答案 1 :(得分:2)

  

是否可以在与主线程共享相同NSPersistentStoreCoordinator的单独线程上运行第二个托管对象上下文?

是的!我建议您在进入CoreData的多线程访问之前仔细阅读Zarra的相应部分。

  

或者,更简洁的是,NSPersistentStoreCoordinator是线程安全的吗?

嗯,“线程安全”这个词在Apple文档中有含义,所以要非常小心! 请参阅此blog article以获得一个很好的解释。