Ответ
Swift предлагает несколько уровней абстракции для работы с многопоточностью, от низкоуровневых системных API до современных языковых конструкций.
1. Grand Central Dispatch (GCD)
Низкоуровневый C-API, управляющий очередями задач (DispatchQueue).
- Главная очередь (Main Queue):
DispatchQueue.main— для обновления UI. - Глобальные очереди: Фоновые очереди с приоритетами качества обслуживания (QoS).
DispatchQueue.global(qos: .userInitiated).async { // Тяжёлая задача let result = processData() // Возврат в главный поток для обновления UI DispatchQueue.main.async { updateUI(with: result) } } - Пользовательские очереди: Можно создавать серийные (
.serial) или конкурентные (.concurrent) очереди.
2. OperationQueue
Высокоуровневая Objective-C-абстракция над GCD, построенная на классах Operation. Позволяет:
- Устанавливать зависимости между задачами.
- Отменять задачи.
- Ограничивать количество параллельных операций (
maxConcurrentOperationCount).
3. Swift Concurrency (async/await) Современная модель, представленная в Swift 5.5. Упрощает написание асинхронного и параллельного кода.
- Асинхронные функции: Помечаются ключевым словом
async.func fetchData() async throws -> Data { let (data, _) = try await URLSession.shared.data(from: url) return data } - Задачи (Task): Являются единицей выполнения.
Task { // Автоматически выполняется в фоновом потоке let data = await fetchData() // `await MainActor.run` гарантирует выполнение в главном потоке await MainActor.run { self.label.text = String(data: data, encoding: .utf8) } } - Акторы (Actors): Предоставляют механизм изоляции состояния для безопасного доступа из разных потоков.
Выбор инструмента:
- Swift Concurrency — предпочтительный выбор для нового кода.
- OperationQueue — для сложных зависимостей и отменяемых задач.
- GCD — для простых фоновых задач или низкоуровневого контроля.