Ответ
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)) задачи начинают выполняться в порядке добавления, но могут завершаться в произвольном порядке, если система имеет доступные потоки.
Важно: Блокирование главной очереди (долгими синхронными операциями) приводит к "зависанию" интерфейса. Все ресурсоёмкие задачи должны выполняться в фоновых очередях.