К какому типу (serial/concurrent) относится DispatchQueue.main в GCD?

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

Ответ

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

Ключевые особенности:

  1. Serial Execution: Задачи (tasks) выполняются строго одна за другой, в порядке их добавления.
  2. Связь с потоком: Это очередь главного потока (Main Thread). Весь UI-код должен выполняться на ней.

Типичное использование для обновления UI:

// После асинхронной операции (сеть, вычисления)
DispatchQueue.global().async {
    let result = performHeavyCalculation()
    // Возвращаемся на главную очередь для обновления интерфейса
    DispatchQueue.main.async {
        self.updateUI(with: result)
    }
}

Важные предупреждения:

  • Избегайте sync на главной очереди: Вызов DispatchQueue.main.sync из главного потока приведет к взаимной блокировке (deadlock), так как поток будет ждать завершения задачи, которую сам же должен выполнить.
  • Не блокируйте главную очередь: Длительные синхронные операции на main приведут к "зависанию" интерфейса.

Альтернативы для фоновых задач: Используйте DispatchQueue.global() (concurrent) или создавайте свои custom очереди.