2016-09-19 4 views
1

まず、dispatch_asyncをキャンセルするための質問がたくさんあることを知っています。実行キューを停止できないと言われました。 しかし、待機中のブロックについては何も掲載されていません。実行を待っているdispatch_asyncキューをキャンセルする

私はこのようなものを実装しています。

@property(nonatomic)dispatch_queue_t My_queue = dispatch_queue_create("something", NULL) 

dispatch_async(self.My_queue, ^(void){ 
    // LONG TASK ONE 
}); 

dispatch_async(self.My_queue, ^(void){ 
    // LONG TASK TWO 
}); 

dispatch_async(self.My_queue, ^(void){ 
    // LONG TASK THREE 
}); 

新しいスレッドでは、3つのブロックを持つキューが存在し、1つは実行され、2つは待機します。待っている2つの方法をキャンセルするには?

+0

NSOperationキューを試しましたか? http://stackoverflow.com/questions/12317154/gcd-how-to-remove-waiting-tasks-from-serial-queue –

答えて

1

あなたが探しているものはdispatch_suspend()です:

ディスパッチオブジェクトを一時停止することで、あなたのアプリケーションは、一時的にそのオブジェクトに関連付けられたすべてのブロックの実行を防ぐことができます。サスペンドは、コール時に実行中のブロックの完了後に発生します。

dispatch_suspend(self.My_queue); 

これは、キューは、保留中のブロック(最初のもの)を実行し、次のものを実行しないことを意味します。一度キューへの参照を取り除くと、保持カウントが減少し、ゼロになるとキューが破棄されます(ブロックがコードの他の部分で参照されていない限り)。

コーディングスタイルに関しては、プロパティ名は小文字で始まり、My_queueの代わりにmyQueueというキャメルケースの規約に従うことをおすすめします。

+0

お返事ありがとうございます。コードスタイルに関して、私のキューの名前は本当にMy_queueではありません:Dだから、実際にはブロックを取り除くためにキューを破壊する必要がありますか?私の場合は、1つ1つ呼び出すことができる非常に似た呼び出しがあるためです。しかし、彼らは似ているので、それらのすべてが実行されるという要点はありません。だから私はそのブロックが実行を待っている他のブロックをすべて削除することを望みます。 –

+0

@ MarkoZadravec(ARCのおかげで)キューを参照する参照がなくなると、キューは自動的に破棄されます。キューが存在する間に他のブロックも存在しますが、キューは現在サスペンドされているため実行されません。 – Cristik

+0

@MarkoZadravecは私の答えはあなたを助けましたか?はいの場合は、それを受け入れられたとしてマークすることができますか? – Cristik

関連する問題