2016-10-30 6 views
0

ネットワークコール、完了ブロック操作、デリゲート/通知などのN非同期操作をどのように実行しますか?このようなiOS - 非同期ブロックベースの操作の連結

考えるとN法:

- (void)methodNWithCompletion:(void (^)(Result *))completion { 
    Operation *operation = [Operation new]; 

    // ... 
    // Asynchronous operation performed here 
    // ... 

    return; 
} 

は簡単な解決策は、前の1の終了ブロック内の各操作を呼び出すために、次のようになります。

[self method1WithCompletion:^(Result *result) { 
    // ... 
    [self method2WithCompletion:^(Result *result) { 
     // ... 
     [self method3WithCompletion:^(Result *result) { 
      // ... 
      [self method4WithCompletion:^(Result *result) { 
       NSLog(@"All done"); 
      } 
     } 
    } 
} 

が、私はより多くのを探していますエレガントで再利用可能なソリューションで、書き込みや保守が簡単です(インデントされたブロックはほとんどありません)。

多くのおかげで、 DAN

+1

質問が「完了したらどうすればわかるのですか?」という場合、通常は「dispatch_group」を使用します。したがって、各非同期呼び出しを行う前にグループに入り、非同期呼び出しの完了ハンドラ内のグループを終了し、すべての非同期呼び出しが完了したときに実行される 'dispatch_group_notify'を設定します。たとえば、http://stackoverflow.com/a/29716069/1271826またはhttp://stackoverflow.com/a/34532865/1271826 – Rob

答えて

3

それはすべてあなたが何をしたいかに依存します。多くの強力な洗練されたツールを自由に使用できます。あなたが完了ブロックが同時に、または何で実行するかどうかを気にしない場合

  • シリアルキュー(あなたが順序で実行完了ブロックをしたい場合)

  • 同時キュー(:あなたはこのようなものを使用することができます順)

  • 派遣・グループ(あなたは)すべて終了ブロックが終了した後にのみ行いたいものがあれば

  • 操作とOperationQueue(あなたはDEPEを確立したい場合ネットワーキング操作が行われなければならない順序 - espを参照してください。

+0

特定の順序で実行される完了ブロックと、それらのすべてが終了した後で実行されるコードが必要です。私はコードを非常に簡単に保つために、Operation/OperationQueueのないソリューションを作成しようとしていました。 – DAN

+0

私の答えで言ったことを読んで、あなたはシリアルキューとディスパッチグループを使用します。私の意見では、操作はより表現力豊かで予期せぬことはより上手く処理できますが、完了ブロックを使用していてメソッドを委任していないと、それを使わずに管理できます。 – matt

+0

はい、私は間違いなくそのアプローチを見ていきます、ありがとう! – DAN