创建一个Grand Central Dispatch队列,该队列仅在一个线程上,用于Core Data

时间:2012-05-02 13:21:36

标签: multithreading core-data grand-central-dispatch

有没有办法创建只在一个线程上运行的GCD队列? 我想使用该队列来处理核心数据操作。

2 个答案:

答案 0 :(得分:4)

是;只需使用标志DISPATCH_QUEUE_SERIAL创建队列(这也是默认值)。但要小心将核心数据操作移到另一个线程上。给定的NSManagedObjectContext只能在单个线程上使用,因此您需要两个上下文,一个用于主线程,一个用于后台线程。正确地执行此操作可能需要一些小心。

您可能需要调查UIManagedDocument(如果这是iOS5),这会为您完成大部分工作。至少你应该阅读它的文档,这样你就可以了解它对多线程的父和子上下文的使用。

答案 1 :(得分:0)

创建托管对象上下文时,指定其并发类型。如果指定NSPrivateQueueConcurrencyType或NSMainQueueConcurrencyType,那么MOC已经在自己的线程上运行。具体地说...

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
// Do other MOC initializations stuff...
[moc.performBlock:^{
    // All code in this block will run in the proper thread for the Managed Object Context.
}];

FWIW,NSMainQueueConcurrencyType以相同的方式工作,但它附加到主队列。您不能在使用NSConfinementConcurrencyType创建的MOC上调用performBlock,创建和所有工作必须在同一个线程中进行。仅在这种情况下,您是否需要创建自己的队列。