Гарантирует ли серийная очередь (serial DispatchQueue) выполнение всех задач на одном потоке в iOS?

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

Ответ

Нет, не гарантирует. Серийная очередь (DispatchQueue) обеспечивает последовательное (serial) выполнение задач, но не привязывает их к одному конкретному потоку.

Ключевые моменты:

  • Последовательность: В любой момент времени на очереди выполняется не более одной задачи. Следующая задача начнётся только после завершения предыдущей.
  • Потоки: GCD управляет пулом потоков. Система может выполнять разные задачи одной серийной очереди на разных потоках из этого пула, особенно если поток был заблокирован или освободился.

Пример:

let serialQueue = DispatchQueue(label: "com.example.serial")

serialQueue.async {
    print("Task 1 on thread: (Thread.current)")
}

serialQueue.async {
    print("Task 2 on thread: (Thread.current)")
}
// Возможный вывод:
// Task 1 on thread: <NSThread: 0x...>{number = 4, name = (null)}
// Task 2 on thread: <NSThread: 0x...>{number = 7, name = (null)}
// Задачи выполнены последовательно, но на разных потоках.

Если требуется строгая привязка к одному потоку, нужно использовать Thread напрямую. Однако в большинстве сценариев GCD этого не требует — важна гарантия последовательности, а не конкретный поток.

Исключение: Главная очередь (DispatchQueue.main) всегда выполняется на главном потоке, так как она связана с Run Loop основного потока для обновления UI.