Как в Swift/iOS обеспечивается многопоточность и параллельные вычисления?

«Как в Swift/iOS обеспечивается многопоточность и параллельные вычисления?» — вопрос из категории Алгоритмы и структуры данных, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Экосистема 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 — для сложных зависимых операций.