1

非同期で実行され、完了ハンドラーを介して結果を返すメソッドがあります。メソッド呼び出し自体は「すぐに」戻りますが、完了ハンドラーが呼び出されるまでに時間がかかる場合があります。

前回の呼び出しで完了ハンドラーが処理されていない場合に、このメソッドが 2 回実行されないように、このメソッドの呼び出しをシリアル化したいと考えています。

今、私はフラグを使用しています

-(void)myAsyncMethod:(void(^)(NSError *error))block
{
  if(_isRunning) 
  {
     return; // would like to queue the call
  }
  _isRunning = YES;
  // do some long running async work which themselves can have completion handlers and run asynchronously

  // look for ever place with a call to "block"

  _isRunning = NO;
  block(error); 
}

dispatch_sync、async などを使用してメソッド呼び出し内でフラグを使用せずにこれを行う方法はありますか?

4

2 に答える 2

0

実際、あなたがしていることはすでに最も簡単な方法です。追加のキュー、グループ、セマフォ、またはまさにあなたが行っていること以外は必要ありません!

暗黙の質問に答えるために、内部状態フラグをチェックすることに何の問題もありません - 実際、それがキャンセルの仕組みです。キューに入れられた後に何かをキャンセルできるようにしたい場合は、最初にチェックする内部「is_cancelled」フラグを設定する (キューに入れずにすぐに) 呼び出すことができるメソッドが必要です。作業ブロック/関数の、設定されている場合は単純にすぐに戻ることを選択します。「作業の本体がまだ完了していない場合は、2 回実行しないでください」という特効薬がないのと同じように、キャンセルに特効薬はありません。最初の呼び出しがまだ機能している間に、後続の呼び出しをキャンセルします。

于 2013-09-12T06:31:38.570 に答える