有没有办法创建只在一个线程上运行的GCD队列? 我想使用该队列来处理核心数据操作。
答案 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,创建和所有工作必须在同一个线程中进行。仅在这种情况下,您是否需要创建自己的队列。