2012-05-08 6 views
7

私はシリアルディスパッチキューを持っていて、その上にいくつかの操作をエンキューします。私は彼らが一度派遣されたら私は操作を取り消すことができないことを読んだ。少なくとも私が派遣したGCDブロックが、別のものを派遣したいと思ったら決定を下す可能性はありますか?エンキューされたGCDブロックを検査しますか?

例では、操作Aをキューにディスパッチしますが、すぐにアプリケーションが別の操作Aをエンキューすると決定したので、すぐに2つの操作がキューに入れられます。

+1

あなたは何をしようとしていますか?あなたの実際の目的が何であるかに基づいて、いくつかの解決策があります。 –

答えて

0

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

これは2つ以上の操作であり、アトミックではないため、操作配列を取得してそこに含まれているかどうかの間に操作が完了する可能性があります。あなたが最初のNSOperationが終了した場合にのみ実行されます別の操作をエンキューし、あなたがもう一度あなたの最初のNSOperationをエンキューしようとしなければならないときを追跡するためにこれを使用することができますので、

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

NSOperationsは、しかし、前提条件APIを持っています。

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

2

ケビン・バラード(Kevin Ballard)は言ったように、正確に何をしようとしているのかを詳しく説明する必要があります。 、キューを「キャンセル」にしたい時はいつでも次に

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

:あなたができることの一つはvalid_のように、フラグがセットされ、その後、あなたは効果的にこのような何かを行うことによって、キュー内の現在の項目以外のすべてをキャンセルすることができますvalid_フラグをNOに設定してください。

また、あなたがやろうとしていることについてさらに詳しい情報を提供してください。私はあなたに良い答えを与えることができます。

関連する問題