В каком потоке выполняется блок кода, переданный в DispatchQueue (GCD)?

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

Ответ

Поток выполнения определяется типом очереди (DispatchQueue), в которую отправлен блок.

Основные типы очередей:

Очередь Тип Поток выполнения Назначение
DispatchQueue.main Последовательная (serial) Главный (UI) поток Все операции с пользовательским интерфейсом.
Глобальные очереди
(DispatchQueue.global(qos:))
Параллельные (concurrent) Фоновые потоки из системного пула Параллельное выполнение нефоновых задач. QoS определяет приоритет.
Кастомные очереди
(DispatchQueue(label:))
По умолчанию последовательные, но могут быть параллельными Фоновые потоки из системного пула Организация и сериализация специфичных задач.

Примеры:

// 1. Обновление UI на главном потоке.
DispatchQueue.main.async {
    self.label.text = "Загрузка завершена"
}

// 2. Выполнение тяжелой задачи в фоне.
DispatchQueue.global(qos: .userInitiated).async {
    let processedImage = self.applyFilters(to: largeImage) // В фоновом потоке
    // Возврат результата на главный поток для отображения.
    DispatchQueue.main.async {
        self.imageView.image = processedImage
    }
}

// 3. Создание своей последовательной очереди для синхронизации.
let serialQueue = DispatchQueue(label: "com.example.serialQueue")
serialQueue.async {
    // Задачи на этой очереди выполняются по одной, в фоновых потоках.
}

Важно: GCD сам управляет созданием, переиспользованием и уничтожением потоков. Разработчик работает только с очередями.