ブロックがキューにディスパッチされると、実行されます。それを防ぐための API はありません。
suspend
これにより、キューが再開されるまで保留中のブロックが実行されなくなります。ただし、ブロックを停止する方法はありません。
従来の方法は、実行中のブロックを早期に停止する必要があるかどうかを確認するために、コードに「チェック」を入れることです。
// return early from block
if (shouldStop) return;
「問題」として表示されるのは、シリアル キューの正確な定義であることに注意してください。操作は、キューに送信された順序でのみ処理できます。前にあるものが完了するのを待つ必要があります。
キューで待機しているブロックをキャンセルするためのより簡単なメカニズムを提供するものを確認することもできNSOperationQueue
ますが、実行中のブロックを停止する唯一の方法は、そのメカニズムをブロックに実装することです。
多くの「ブロッキング」ブロックをキャンセルする必要があることがわかった場合は、設計に欠陥がある可能性が高く、設計を再検討する必要があります。
さらに、待機中のタスクの「後ろ」にあるタスクが実際にそのタスクを待つ必要がない場合、なぜそれらをシリアルキューの後ろに配置するのですか? 同時キュー、個別のシリアル キュー、またはその他のメカニズムを使用します。
ここで、I/O 操作をブロックするためにディスパッチ キューを使用しないでください。それを行うことができ、多くの場合、それが最も簡単ですが、アプリに最高のパフォーマンス特性が必要な場合は、dispatch_io
CPU を集中的に使用する他のスレッドとよりよく統合されるものを使用する必要があります。
ここでの重要なポイントは、「現在実行中のブロックがブロックされているときに、シリアル キューでブロックを実行するにはどうすればよいですか?」のような答えを得ようとするのではなく、ということだと思います。このシナリオが発生しないように、アプリケーションをより適切に設計するにはどうすればよいかを自問する必要があります。
仕事を実行する必要がない場合は、待つ必要はありません。作業を完了する必要がある場合は、待つだけです...