1

1 つの呼び出しに結合するいくつかの非同期呼び出しがあります。

-(void) loadA:(ArrayBlock)completion failure(FailureBlock):failure;
-(void) loadB:(ArrayBlock)completion failure(FailureBlock):failure;
-(void) loadC:(ArrayBlock)completion failure(FailureBlock):failure;

上記の呼び出しを使用する結合メソッド:

- (void) loadAll:(ObjectBlock)completion;

補完ブロックには、 という 3 つの配列を持つオブジェクトが含まれていますarray[A-C]。子呼び出しのいずれかが失敗した場合、オブジェクト内のそれぞれの配列は単純に nil に設定されます。

これらの 3 つのブロックをネストして、失敗または前のブロックの完了時に次のブロックを呼び出す代わりに (これは非常に面倒です)、GCD を使用して次のようなことをしたいと考えています。

  1. すべての通話をキューに追加
  2. すべての呼び出しが終了するまで待ちます (成功ブロックまたは失敗ブロックのいずれかが呼び出されました)。
  3. loadAll完了ブロックからのすべての結果を結合し、メソッドの完了ブロックを呼び出します。

同期呼び出しを使用して GCD でこれが可能であることはわかっていますが、3 つの非同期の「子呼び出し」でこれを実現する方法がわかりません。

4

1 に答える 1

3

ディスパッチ グループを調べてください。それらに対して同期待機を行うことができます。そして、本当に、乱雑という言葉は間違っています。少し複雑な表現の方が適切かもしれません。ネストされたディスパッチ ブロックとグループを使用して中間結果を待機することで、私は幸運に恵まれました。また、dispatch_async_barrier を使用して、ブロックが実行される前に既にキューにあるブロックが終了するのを防ぐこともできます。ブロックはディスパッチ キューにもブロックを追加できます。

依存関係があったことを思い出しますが、CGD 文献でそのセクションを見つけることができません。

私が本当にお勧めするのは、これを鉛筆で紙にスケッチすることです。自分自身を納得させたら、コーディングを開始する方法がわかります。

于 2012-07-31T22:45:09.723 に答える