Ответ
При вызове async на serial очереди (например, DispatchQueue) происходит следующее:
Поведение:
- Задача ставится в очередь — добавляется в конец serial-очереди.
- Нет блокировки текущего потока — выполнение вызывающего кода продолжается немедленно.
- Сериальное выполнение — задача выполнится на фоновом потоке, но строго после завершения всех предыдущих задач в этой же очереди.
Пример:
let serialQueue = DispatchQueue(label: "com.example.serial")
serialQueue.async {
print("Task 1 started")
Thread.sleep(forTimeInterval: 1)
print("Task 1 finished")
}
serialQueue.async {
print("Task 2 started")
}
// Вывод:
// Task 1 started
// Task 1 finished
// Task 2 started
Почему так происходит?
Serial очередь гарантирует порядок FIFO (First-In-First-Out) для задач. Асинхронная отправка (async) отделяет планирование от выполнения — поток не блокируется, но порядок сохраняется.