Ответ
Экосистема iOS предоставляет несколько инструментов для работы с многопоточностью, от низкоуровневых до современных высокоуровневых API.
1. Grand Central Dispatch (GCD) Фреймворк для управления очередями (очередями задач).
// Выполнение задачи в фоновом потоке
DispatchQueue.global(qos: .userInitiated).async {
let processedData = expensiveCalculation()
// Возврат результата в главный поток для обновления UI
DispatchQueue.main.async {
self.updateUI(with: processedData)
}
}
2. Operation и OperationQueue Более высокоуровневая абстракция над GCD, поддерживающая зависимости между операциями, отмену и наблюдение за состоянием.
let downloadOp = BlockOperation { /* Загрузка */ }
let processOp = BlockOperation { /* Обработка */ }
processOp.addDependency(downloadOp) // Обработка начнется только после загрузки
let queue = OperationQueue()
queue.addOperations([downloadOp, processOp], waitUntilFinished: false)
3. Swift Concurrency (async/await, Actors) Современный, безопасный и выразительный способ, представленный в Swift 5.5.
// Async функция
func fetchUserData() async throws -> UserData {
let data = try await networkService.request(.userProfile) // Без callback hell
return try JSONDecoder().decode(UserData.self, from: data)
}
// Использование
Task {
do {
let user = try await fetchUserData()
await MainActor.run { // Гарантированное выполнение на главном потоке
self.user = user
}
} catch {
// Обработка ошибки
}
}
// Actor для защиты общих ресурсов
actor Counter {
private var value = 0
func increment() { value += 1 }
func getValue() -> Int { return value }
}
Выбор инструмента:
- Swift Concurrency — предпочтительный выбор для нового кода, поддерживающего iOS 13+ (с
@available). - GCD — для простых фоновых задач или поддержки legacy-кода.
- OperationQueue — для сложных зависимых операций.