多线程使用核心数据(NSOperationQueue和NSManagedObjectContext)

时间:2009-09-21 13:19:57

标签: iphone objective-c multithreading core-data

在Apple的Concurrency with Core Data核心数据文档中,他们列出了线程安全的首选方法,即每个线程使用单独的NSManagedObjectContext,并使用共享的NSPersistentStoreCoordinator。

如果我有一些NSOperations在NSOperationQueue上一个接一个地运行,是否会产生很大的开销来创建每个任务的上下文?

当NSOperationQueue的最大并发操作数为1时,我的许多操作将使用相同的线程。我可以使用线程字典为每个线程创建一个NSManagedObjectContext吗?如果我这样做,我将在以后清理我的背景时遇到问题吗?

在这种情况下使用Core Data的正确方法是什么?

3 个答案:

答案 0 :(得分:19)

在这种情况下使用Core Data的正确方法是为每个操作创建一个单独的NSManagedObjectContext ,以便在使用前通过-[NSManagedObjectContext lock]锁定一个上下文和-[NSManagedObjectContext unlock]使用后)。如果操作是串行的并且没有其他线程使用上下文,则锁定的方法可能有意义。

使用哪种方法是一个经验问题,没有数据就无法解决。变量太多,不具备一般规则。性能测试中的硬数字是做出明智决策的唯一方法。

答案 1 :(得分:2)

使用NSOperationQueue开始的操作使用最大并发操作计数为1将不会在同一个线程上运行所有操作。操作将一个接一个地执行,但每次都会创建一个新线程。

因此,在线程字典中创建对象几乎没用。

答案 2 :(得分:2)

虽然这个问题已经过时了,但实际上它已经成为Google搜索结果中关于“NSMangedObjectContext线程”的最重要的问题,因此,我只是提出一个新的答案

新的'首选'方法是使用initWithConcurrencyType:并告诉MOC它是主线程MOC还是辅助线程moc。然后,您可以在其上使用新的performBlock:和performBlockAndWait:方法,MOC将负责对其进行序列化操作的本地'线程。

然后问题就变成了如何智能地处理您的应用程序可能产生的各种MOC之间的数据合并,以及其他一千个使生活变得有趣的细节。作为程序员。