1. ホーム
  2. cocoa

Grand Central Dispatch で dispatch_sync を使用する。

2023-12-12 13:16:19

質問

の目的は何なのか、本当に明確な使用例で説明できる人はいますか? dispatch_syncGCD は何のためにあるのでしょうか?どこで、なぜこれを使わなければならないのか、理解できません。

ありがとうございます!

どのように解決するのですか?

ブロックを実行し、結果を待ちたいときに使います。

この例として、同期のためにロックの代わりにディスパッチキューを使っているパターンがあります。例えば、共有の NSMutableArray があるとします。 a があり、ディスパッチキューによってアクセスが媒介されているとします。 q . バックグラウンドスレッドが配列に追加している間(非同期)、フォアグラウンドスレッドは最初の項目を取り出している(同期)かもしれません。

NSMutableArray *a = [[NSMutableArray alloc] init];
// All access to `a` is via this dispatch queue!
dispatch_queue_t q = dispatch_queue_create("com.foo.samplequeue", NULL);

dispatch_async(q, ^{ [a addObject:something]; }); // append to array, non-blocking

__block Something *first = nil;            // "__block" to make results from block available
dispatch_sync(q, ^{                        // note that these 3 statements...
        if ([a count] > 0) {               // ...are all executed together...
             first = [a objectAtIndex:0];  // ...as part of a single block...
             [a removeObjectAtIndex:0];    // ...to ensure consistent results
        }
});