まず、このようなシリアル キューを作成します
static dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
次に、未知の時点で、このようにタスクがキューに追加されます
dispatch_async(queue, ^{
// do something, which takes some time
});
最初のタスクがまだ完了していない場合、新しいタスクは最初のタスクが完了するまで待機します (もちろん、これがシリアル キューの目的です)。
しかし、キューに 5 つの新しいタスクを追加すると、元の最初のタスクがまだ実行されている間に、新しいタスク 1 番、2 番、3 番などを実行したくありませんが、取得したいタスク 1 から 4 を削除し、元の最初のタスクが終了した後、タスク 5 の実行を直接開始します。
つまり、新しいタスクを追加する場合は、待機中のタスク (現在実行中のタスクではない) をキューからポップしたいと考えています。
これには組み込みのメカニズムがありますか、それとも自分で実装する必要がありますか? 後者の場合、キュー内の単一のタスクを特定して削除するにはどうすればよいでしょうか?