Ответ
Основные инструменты для работы с многопоточностью в экосистеме Apple:
-
Grand Central Dispatch (GCD / libdispatch): Низкоуровневый C-фреймворк для управления очередями задач.
- Очереди:
DispatchQueue(serial, concurrent),DispatchGroup,DispatchSemaphore. - Пример:
// Отправка задачи в фоновую очередь DispatchQueue.global(qos: .userInitiated).async { let result = performHeavyCalculation() // Возврат результата в главный поток для обновления UI DispatchQueue.main.async { updateUI(with: result) } }
- Очереди:
-
OperationQueue: Высокоуровневая абстракция на основе GCD. Позволяет создавать переиспользуемые
Operationс зависимостями, приоритетами и возможностью отмены.let queue = OperationQueue() queue.maxConcurrentOperationCount = 2 let downloadOp = BlockOperation { /* Загрузка данных */ } let processOp = BlockOperation { /* Обработка данных */ } processOp.addDependency(downloadOp) // Обработка начнется только после загрузки queue.addOperations([downloadOp, processOp], waitUntilFinished: false) -
Swift Concurrency (async/await): Современный, безопасный подход, представленный в Swift 5.5.
- Ключевые элементы:
async/await,Task,Actor. - Пример:
func fetchData() async throws -> Data { let (data, _) = try await URLSession.shared.data(from: url) return data }
Task { let data = try await fetchData() await MainActor.run { updateUI(with: data) } }
- Ключевые элементы:
-
Средства синхронизации: Для защиты общих ресурсов от состояний гонки.
NSLock,os_unfair_lock(более эффективный).@Atomicсвойства (через property wrappers).- Актёры (Actors) в Swift Concurrency.
Рекомендация: Для нового кода предпочтительно использовать Swift Concurrency, так как он обеспечивает безопасность на уровне компилятора и более читаемый код.