2

GCD でバックグラウンド処理を行っており、Core Data でいくつかのオブジェクトを保存しています。メソッドでは、バックグラウンド スレッドでコア データ操作を実行する同時実行型を[self saveData]作成しています。すべての Core Data 操作を 内で実行しています。NSManagedObjectContextNSPrivateQueueConcurrencyTypeperformBlock

さて、メインスレッドから呼び出す必要があり[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:したがって、どのスレッドでorperformBlockAndWait:が呼び出されるかは問題ではありません。

したがって、すべての操作に使用する場合、追加dispatch_async(dispatch_get_main_queue(), ^{});は必要ありません。[self saveData]performBlock:

于 2012-12-30T15:31:27.280 に答える