为 Core Data 创建一个仅在一个线程上的 Grand Central Dispatch 队列
Posted
技术标签:
【中文标题】为 Core Data 创建一个仅在一个线程上的 Grand Central Dispatch 队列【英文标题】:Create a Grand Central Dispatch queue that will only be on one thread, for Core Data 【发布时间】:2012-05-02 13:21:35 【问题描述】:有没有办法创建只在一个线程上运行的 GCD 队列? 我想使用该队列来处理核心数据操作。
【问题讨论】:
【参考方案1】:是的;只需创建带有标志DISPATCH_QUEUE_SERIAL
的队列(这也是默认值)。但一定要小心将核心数据操作转移到另一个线程上。给定的NSManagedObjectContext
只能在单个线程上使用,因此您需要两个上下文,一个用于主线程,一个用于后台线程。正确执行此操作可能需要一些小心。
您可能想调查UIManagedDocument
(如果这是ios5),它可以为您完成大部分工作。至少您应该阅读它的文档,以便了解它在多线程中使用父上下文和子上下文。
【讨论】:
这个答案似乎已经过时了。来自文档:“串行队列(也称为私有调度队列)按照它们添加到队列中的顺序一次执行一个任务。当前执行的任务在不同的线程上运行(可能不同于由调度队列管理的任务到任务)”【参考方案2】:创建托管对象上下文时,您指定其并发类型。如果你指定了 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,创建和所有工作必须在同一个线程中进行。仅在这种情况下,您是否需要创建自己的队列。
【讨论】:
以上是关于为 Core Data 创建一个仅在一个线程上的 Grand Central Dispatch 队列的主要内容,如果未能解决你的问题,请参考以下文章
创建的线程数为 12,但仍仅在 12 核 CPU 中的一个核上运行