3

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

4

2 回答 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 回答