Всегда ли задачи с MainQueue (GCD) выполняются на MainThread?

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

Ответ

Да. DispatchQueue.main — это последовательная очередь, неразрывно связанная с главным потоком приложения (MainThread). Система гарантирует, что любой блок кода, отправленный в DispatchQueue.main.async или DispatchQueue.main.sync, будет выполнен именно на MainThread.

Почему это важно? Все операции с пользовательским интерфейсом (обновление UIKit/SwiftUI представлений) должны выполняться на MainThread, так как UI-фреймворки не являются потокобезопасными.

Пример:

// Этот код выполнится на MainThread
DispatchQueue.main.async {
    self.label.text = "Updated"
    self.view.setNeedsLayout()
}

Важное уточнение: Обратное утверждение не всегда верно. MainThread может выполнять код не только из MainQueue. Например, если вызвать performSelector(onMainThread:) или OperationQueue.main.addOperation, задача также попадет на MainThread, но через другие механизмы. Однако для GCD связь MainQueueMainThread абсолютна.