Ответ
Поток выполнения определяется типом очереди (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 сам управляет созданием, переиспользованием и уничтожением потоков. Разработчик работает только с очередями.