我正在使用 GCD 进行一些后台处理,并使用 Core Data 保存一些对象。在方法 [self saveData]
中,我创建了一个具有并发类型 NSPrivateQueueConcurrencyType
的 NSManagedObjectContext
,以在后台线程上执行 Core Data 操作。我正在 performBlock
中运行所有核心数据操作。
现在,是否有必要从主线程调用 [self saveData]
或者我可以在我所在的后台线程中继续(以避免额外的调用 dispatch_async(dispatch_get_main_queue() , ^{});
)
像这样:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
BOOL isProcessed = [self processData];
if (isProcessed) {
// Save with Core Data
[self saveData];
}
});
或者我需要做什么:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
BOOL isProcessed = [self processData];
if (isProcessed) {
dispatch_async(dispatch_get_main_queue(), ^{
// Save with Core Data
[self saveData];
});
}
});
最佳答案
performBlock:
和 performBlockAndWait:
确保 block 操作在为上下文指定的队列上执行。因此,调用哪个线程 performBlock:
或 performBlockAndWait:
并不重要。
如果 [self saveData]
使用 performBlock:
则不需要额外的 dispatch_async(dispatch_get_main_queue(), ^{});
所有操作。
关于objective-c - dispatch_async 中的 NSManagedObjectContext PerformBlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14091878/