我正在使用GCD进行一些后台处理,并使用Core Data保存一些对象。在方法[self saveData]
中,我正在创建一个并发类型为NSManagedObjectContext
的NSPrivateQueueConcurrencyType
,以在后台线程上执行Core Data操作。我正在performBlock
中运行我的所有Core Data操作。
现在,是否有必要从主线程调用[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:
确保在为上下文指定的队列上执行块操作。因此,在哪个线程performBlock:
或performBlockAndWait:
上调用都没有关系。
因此,如果dispatch_async(dispatch_get_main_queue(), ^{});
所有操作均使用[self saveData]
,则不需要多余的performBlock:
。
关于objective-c - dispatch_async中的NSManagedObjectContext performBlock,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14091878/