0

多くの長時間実行される非同期メソッドには、入力パラメーターとして完了ハンドラー ブロックがアタッチされています。

操作がキャンセルされた場合に完了ハンドラーを呼び出す必要があるかどうかはわかりません。

-(void)longRunningAsyncOperation:(Input *)input completionHandler:(Block)completionHandler
{
  // long running code

  // periodic checks for cancelation

  if(_canceled)
  {
   // should completion handler still be called?
   return;
  }

  // more long running code

  // completed
  completionHandler(someData);
}
4

3 に答える 3

0

はい、完了ハンドラーを呼び出す必要があります。

これの理論的根拠は、完了ハンドラーを何らかの形式の戻り値と見なすことができるということです。

したがって、完了ハンドラーを呼び出さないことは、何かを返すと宣言されている関数で値を返さないようなものです。

于 2013-09-18T12:52:00.550 に答える
0

ここに必ずしも「正解」が1つあるとは思いません。必要なことは何でもやらせればいいのです。@Fogmeister がコメントで提案しているように、1 つのオプションは、完了ルーチンがキャンセルされたか正常に完了したかを示す引数を取るようにすることです。関係者が操作がキャンセルされたことを知ることができるように、すべての場合に何かを呼び出すことをお勧めします。

「成功」ブロックと「失敗」ブロックという 2 つの異なる完了ブロックを取る他の A​​PI を見てきました。私の考えでは、ステータスを示すために引数を取る単一のブロックは、より適応性の高いパターンのように思えます。

キャンセル時に完了ブロックを呼び出さないと事実上「失われた情報」があります。他のメカニズムがなければ、操作がキャンセルされたことを外部の世界が知ることは不可能であるため、完了への引数であるか、成功/失敗ブロックであるかにかかわらず、これらのパターンのいずれかが、単に何も呼び出さないよりも望ましいようです。 .

于 2013-09-16T11:45:01.107 に答える
0

@ipmccは正しいです。通常、正解は 1 つではありませんが、ベスト プラクティスでは、常に完了ブロックを呼び出す必要があり、完了ブロックが実際に必要な場合は、成功/キャンセル フラグを渡す必要があります。これがベスト プラクティスである理由は、取り消された操作の前置きとして一部のメモリが割り当てられている可能性があり、完了ハンドラを呼び出さないと、それを再び解放する機会がなくなるためです。

于 2013-09-16T23:21:20.653 に答える