我正在使用GCD进行一些后台处理,并使用Core Data保存一些对象。在方法[self saveData]中,我正在创建一个并发类型为NSManagedObjectContextNSPrivateQueueConcurrencyType,以在后台线程上执行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/

10-09 03:48