有没有办法创建只在一个线程上运行的 GCD 队列?我想使用该队列来处理核心数据操作。
问问题
744 次
2 回答
4
是的; 只需使用标志创建队列DISPATCH_QUEUE_SERIAL
(这也是默认设置)。但一定要小心将核心数据操作转移到另一个线程上。给定NSManagedObjectContext
只能在单个线程上使用,因此您需要两个上下文,一个用于主线程,一个用于后台线程。正确执行此操作可能需要一些小心。
您可能想要调查UIManagedDocument
(如果这是 iOS5),它为您完成了大部分工作。至少您应该阅读它的文档,以便了解它在多线程中使用父上下文和子上下文。
于 2012-05-02T13:28:18.733 回答
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,创建和所有工作必须在同一个线程中进行。仅在这种情况下,您是否需要创建自己的队列。
于 2012-05-02T18:54:37.907 回答