Ответ
Task — это фундаментальная единица асинхронной работы в современной модели конкурентности Swift (Swift Concurrency). Она представляет собой изолированную задачу, которая выполняется асинхронно и может быть отменена.
Для чего используется?
- Для запуска асинхронного кода из синхронного контекста.
- Для управления жизненным циклом и отменой асинхронных операций.
- Для организации структурированного параллелизма.
Базовое создание задачи:
// Запуск новой асинхронной задачи
Task {
// Этот код выполняется асинхронно в рамках cooperative thread pool
let image = await downloadImage(from: url)
await MainActor.run { // Возврат на главный поток для обновления UI
self.imageView.image = image
}
}
Типы задач и управление:
-
Структурированные задачи: Создаются с помощью
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) } -
Неструктурированные задачи (
Task.detached): Не наследуют контекст родителя (приоритет, актор) и живут независимо.Task.detached(priority: .background) { let result = await heavyBackgroundProcessing() print(result) } -
Отмена задачи:
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), освобождая поток для других задач.