Что произойдет при асинхронной отправке задачи на serial очередь в Swift?

«Что произойдет при асинхронной отправке задачи на serial очередь в Swift?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При вызове async на serial очереди (например, DispatchQueue) происходит следующее:

Поведение:

  1. Задача ставится в очередь — добавляется в конец serial-очереди.
  2. Нет блокировки текущего потока — выполнение вызывающего кода продолжается немедленно.
  3. Сериальное выполнение — задача выполнится на фоновом потоке, но строго после завершения всех предыдущих задач в этой же очереди.

Пример:

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) отделяет планирование от выполнения — поток не блокируется, но порядок сохраняется.