1

一度に複数のブロックベースのタスクを実行したいViewControllerがある場合、完了ブロックが実行された後、どのように制御をViewControllerに戻すことができますか。

ViewControllerOneが、それぞれが前のタスクの結果に依存するいくつかのタスクを実行したいとします。各完了ブロックが実行された後、このコントロールはどのようにViewControllerに戻されますか?

私はこれについて考え始めました、そして私は他の誰もがそれを読んだりテストしたりする人に確かに混乱を引き起こすだけである深くネストされたブロックパターンに向かっていました。

タスクが実行され、完了ブロックは、次のタスクが依存する独自の完了タスクを持つ次のタスクに必要な結果またはエラーを返します。

ビューコントローラという1つの場所でコントロールを管理するにはどうすればよいですか?

完了ブロックは、呼び出されているView Controller(self)へのポインターを使用して、次のタスクを処理する次の関数を呼び出すだけですか?

4

3 に答える 3

2

あなたが達成しようとしていることは私には少し不明確ですが、あなたは次のようなことを試みることができます:

- (id)performBlocks:(NSArray *)blocks
{
    id state = [self initialState];

    for(id (^block)(id) in blocks)
    {
        state = block(state);

        // do something with state
    }

    return state;
}

各ブロックは前のブロックの結果に依存するため、連続して実行する必要があります。各ブロックによって更新される状態オブジェクトを渡すことができ、その後、連続するブロックへの呼び出しの間に、呼び出し間の状態に基づいて任意の処理を実行できます。

于 2012-09-12T15:56:30.643 に答える
1

これは、NSOperationの依存関係機能の理想的なユースケースのように思えます。つまり、

- (void)addDependency:(NSOperation *)operation
- (void)removeDependency:(NSOperation *)operation

特定の操作を他の操作に依存させることができるため、操作間の依存関係のグラフを作成できます。

于 2012-09-12T16:56:08.687 に答える
1

「制御を与える」をviewController(VC)に戻すことについてのあなたのコメントは、VCが通常runLoopコールバックでブロックされたままで、何かが起こるのを待っているという点で意味がありません。

私があなたが何を望んでいるのかを理解していれば、これらすべてのことが起こっている間に、VCへの他のメッセージを処理する機会があります。メソッドを定義します。

{
   NSMutableArray *blocks; // ivar
   BOOL isCanceled;
}
typedef void (^block_t)(id input);

-(void)performBlock:(id)result;

すべてのブロックを一度に作成するか、ゆっくりと作成しますが、ブロック配列に追加します。各ブロックには、必要な作業項目を含む1つのオブジェクトが渡されます。

block_t b = ^(id input) {
  ... do some work using input;
  NSDictionary *dict = ....; // a possible result of the work
  dispatch_async(dispatch_get_main_queue(), ^{ [self performBlock:dict; } );
};

最初のブロックはいくつかのキューにディスパッチされます-バックグラウンドキューである可能性もあり、その結果をVCに送り返します。

-(void)performBlock:(id)result
{
  if(isCanceled) { // some other method set this flag
  ...
  } else if([blocks count]) {
    block_t b = [blocks objectAtIndex:0];
    [blocks removeObjectAtIndex:0]; // guessing at method name
    dispatch_async(some queue, b);
  }
}
于 2012-09-12T21:29:50.483 に答える