2

我正在使用 GCD 进行一些后台处理,并使用 Core Data 保存一些对象。在方法中[self saveData],我创建了一个NSManagedObjectContext并发类型NSPrivateQueueConcurrencyType来在后台线程上执行核心数据操作。我在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];
        });
    }
});
4

1 回答 1

4

performBlock:performBlockAndWait:确保在为上下文指定的队列上执行块操作。performBlock:因此,在哪个线程上调用或被调用并不重要performBlockAndWait:

因此,如果用于所有操作,dispatch_async(dispatch_get_main_queue(), ^{});则不需要额外的。[self saveData]performBlock:

于 2012-12-30T15:31:27.280 回答