Является ли DispatchQueue.main последовательной или параллельной очередью в Swift?

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

Ответ

DispatchQueue.main — это глобальная последовательная (serial) очередь.

Это означает, что задачи (async или sync), отправленные в эту очередь, выполняются строго одна за другой, в порядке их добавления (FIFO).

Почему это важно? Главный поток (main thread) отвечает за весь пользовательский интерфейс. Фреймворки UIKit и AppKit не являются потокобезопасными. Все операции с UI-элементами (обновление текста, анимация, обработка касаний) должны выполняться последовательно в главном потоке, чтобы избежать конфликтов и неопределённого поведения.

Пример:

// Задачи выполнятся последовательно:
DispatchQueue.main.async {
    self.label.text = "Step 1"
}
DispatchQueue.main.async {
    self.label.text = "Step 2" // Выполнится только после "Step 1"
    print("Label updated")
}
// Вывод гарантирован: "Label updated" напечатается после установки "Step 2".

Отличие от параллельной (concurrent) очереди: В параллельной очереди (DispatchQueue(label: "", attributes: .concurrent)) задачи начинают выполняться в порядке добавления, но могут завершаться в произвольном порядке, если система имеет доступные потоки.

Важно: Блокирование главной очереди (долгими синхронными операциями) приводит к "зависанию" интерфейса. Все ресурсоёмкие задачи должны выполняться в фоновых очередях.