Что такое `Task` в Swift Concurrency?

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

Ответ

Task — это фундаментальная единица асинхронной работы в современной модели конкурентности Swift (Swift Concurrency). Она представляет собой изолированную задачу, которая выполняется асинхронно и может быть отменена.

Для чего используется?

  • Для запуска асинхронного кода из синхронного контекста.
  • Для управления жизненным циклом и отменой асинхронных операций.
  • Для организации структурированного параллелизма.

Базовое создание задачи:

// Запуск новой асинхронной задачи
Task {
    // Этот код выполняется асинхронно в рамках cooperative thread pool
    let image = await downloadImage(from: url)
    await MainActor.run { // Возврат на главный поток для обновления UI
        self.imageView.image = image
    }
}

Типы задач и управление:

  1. Структурированные задачи: Создаются с помощью async let или withTaskGroup. Их жизненный цикл привязан к родительской задаче.

    func fetchMultipleResources() async throws -> (Data, Data) {
        // Параллельный запуск двух асинхронных операций
        async let firstData = fetchData(from: url1)
        async let secondData = fetchData(from: url2)
        // Ожидание завершения обеих задач
        return try await (firstData, secondData)
    }
  2. Неструктурированные задачи (Task.detached): Не наследуют контекст родителя (приоритет, актор) и живут независимо.

    Task.detached(priority: .background) {
        let result = await heavyBackgroundProcessing()
        print(result)
    }
  3. Отмена задачи:

    let task = Task {
        try await Task.sleep(nanoseconds: 2_000_000_000)
        print("Эта строка не выполнится, если задача отменена")
    }
    // ... позже
    task.cancel() // Запрос на отмену
    
    // Внутри задачи можно проверять статус отмены
    if Task.isCancelled { return }
    // или использовать Task.checkCancellation(), который выбросит ошибку при отмене

Важно: Задачи выполняются на cooperative thread pool, управляемом рантаймом. Они не блокируют потоки, а приостанавливаются (await), освобождая поток для других задач.