7

シリアルディスパッチキューがあり、それにいくつかの操作をキューに入れているとしましょう。発送後はキャンセルできないとのことですが。少なくとも、ディスパッチしたGCDブロックを表示して、別のブロックをディスパッチするかどうかを決定することはできますか?

たとえば、オペレーションAをキューにディスパッチしましたが、アプリケーションが別のオペレーションAをキューに入れることを決定した直後に、これらのオペレーションのうち2つがキューに入れられました。

4

2 に答える 2

2

ケビン・バラードが言ったように、何をしようとしているのかを正確に説明する必要があります。できることの 1 つは、次のようにフラグを設定することです。valid_次に、次のようにして、キュー内の現在のアイテム以外のすべてを効果的にキャンセルできます。

dispatch_async(queue, ^{
  if (valid_) {
    // perform your task here
  }
});

次に、キューを「キャンセル」したいときはいつでも、valid_フラグを に設定しますNO

繰り返しますが、あなたがやろうとしていることについてより多くの情報を提供してください。より良い答えを提供できます。

于 2012-05-12T02:32:00.653 に答える
0

NSOperation は GCD の上に構築されているため、addOperationWithBlock:を使用してブロックを NSOperationQueue に置くことができます。その後、NSOperationQueue で操作を呼び出して、未完了の操作の NSArray を取得できます。

これに関する問題は、これが 2 つ以上の操作であり、アトミックではないことです。そのため、操作配列を取得してそこに含まれているかどうかを確認する間に操作が終了する可能性は十分にあります。

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html

ただし、NSOperations には前提条件の API があるため、最初の NSOperation が終了した場合にのみ実行される別の操作をキューに入れることができ、これを使用して、最初の NSOperation をいつ再度キューに入れる必要があるかを追跡できます。

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html#//apple_ref/doc/uid/TP40004591

于 2012-05-16T17:49:40.827 に答える