为 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 中的一个核上运行

我应该多久保存到 Core Data?

iOS、Core Data 和 iCloud - 切换上下文

Core Data 代码和多线程

Core Data 将 objectID 传递给另一个线程

Core Data 的推断映射模型创建(轻量级迁移)崩溃。线程问题?