Какие основные инструменты и модели многопоточности доступны в Swift?

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

Ответ

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 — для простых фоновых задач или низкоуровневого контроля.