2009-09-21 98 views
14

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

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

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

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

回答

19

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

使用哪种方法是一个经验问题,如果没有数据就不能回答。有一个通用规则的变量太多了。来自性能测试的硬性数字是做出明智决定的唯一途径。

+1

仅供参考 - 'lock'和'unlock'在iOS8和OSX 10.10中不推荐使用。建议是:“使用队列样式上下文和-performBlockAndWait:改为” – 2015-06-23 13:42:22

2

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

因此,在线程字典中创建对象将没有多大用处。

+2

无法保证每次都会成为新线程。事实上,在Snow Leopard上,NSOperationQueue使用明确重用线程的Grand Central Dispatch。 – 2009-09-21 17:49:48

+0

这个问题是关于iPhone,而不是雪豹。当然,没有**保证**,是否曾经有过? – 2009-09-21 18:00:29

2

虽然这个问题很老,但它实际上是在'NSMangedObjectContext线程'的谷歌搜索结果的顶部,所以我只需要一个新的答案。

新'首选'方法是使用initWithConcurrencyType:并告诉MOC它是主线程MOC还是辅助线程moc。然后,您可以使用新的performBlock:和performBlockAndWait:它与MOC方法将在它的“原生”线程序列化操作的关怀。然后

问题变成你如何智能地处理您的应用程序可能会催生各种MOCS之间合并数据,万千其他细节,让生活“乐趣”作为一名程序员一起。