Сначала я создаю последовательную очередь, подобную этой
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 после завершения первоначальной первой задачи.
Другими словами, я хочу поместить любую ожидающую задачу (а не ту, которая в данный момент выполняется) из очереди, если я добавлю новую.
Есть ли механизм сборки для этого или я должен сам реализовать это? И для последнего, как бы я идентифицировал отдельные задачи внутри очереди и удалил их?