Что такое Grand Central Dispatch (GCD) в iOS/macOS?

«Что такое Grand Central Dispatch (GCD) в iOS/macOS?» — вопрос из категории Многопоточность, который задают на 31% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Grand Central Dispatch (GCD) — это низкоуровневый фреймворк для управления параллельными и асинхронными операциями в iOS и macOS. Он абстрагирует работу с потоками, используя модель очередей (queues) и задач (в виде блоков или замыканий), и автоматически управляет пулом потоков.

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

  • Очереди (Queues):
    • Main Queue (DispatchQueue.main): Серийная очередь, связанная с главным потоком. Используется для всех операций с UI.
    • Глобальные очереди (DispatchQueue.global(qos:)): Параллельные системные очереди с разными приоритетами качества обслуживания (Quality of Service, QoS):
      • .userInteractive — для мгновенной обратной связи (анимации, события).
      • .userInitiated — для задач, инициированных пользователем, требующих быстрого результата.
      • .utility — для длительных задач с индикатором прогресса (загрузка, вычисления).
      • .background — для задач, невидимых пользователю (синхронизация, бэкап).
    • Пользовательские очереди (DispatchQueue(label:attributes:)): Создаются разработчиком. Могут быть серийными (.serial, по умолчанию) или параллельными (.concurrent).

Основные операции:

  • async — асинхронное выполнение. Не блокирует текущий поток.
  • sync — синхронное выполнение. Блокирует текущий поток до завершения задачи.

Пример асинхронной работы с обновлением UI:

// Выполнить тяжелую задачу в фоне
DispatchQueue.global(qos: .userInitiated).async {
    let processedData = self.performHeavyCalculation()

    // Вернуться на главный поток для обновления интерфейса
    DispatchQueue.main.async {
        self.updateUI(with: processedData)
    }
}

Дополнительные механизмы GCD:

  • Группы (DispatchGroup): Для отслеживания завершения набора задач.
  • Семафоры (DispatchSemaphore): Для контроля доступа к ограниченному количеству ресурсов.
  • Барьеры (DispatchWorkItemFlags.barrier): Для обеспечения эксклюзивного доступа к ресурсу в concurrent очереди.
  • Источники (DispatchSource): Для мониторинга системных событий (таймеры, сигналы, файловые дескрипторы).

Почему GCD? Он обеспечивает эффективное использование многоядерных процессоров, упрощает многопоточное программирование и помогает избежать распространенных ошибок, таких как deadlock (при осторожном использовании sync).