async let, Task и отмена
Запускайте работу параллельно с помощью async let , создавайте независимые задачи Task и обрабатывайте отмену совместно с вызывающим кодом.
«async let, Task и отмена» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 3 уроков всего.
Что мы рассмотрим
Вы научитесь:
- Запускать параллельные задачи одного уровня с помощью async let
- Запускать независимые единицы работы через Task { }
- Реагировать на отмену с помощью кооперативных проверок
Основы async let
async let запускает дочерние задачи параллельно в одной области видимости; перед выходом из неё необходимо использовать await.
func loadA() async -> Int { try? await Task.sleep(nanoseconds: 200_000_000); return 1 }
func loadB() async -> Int { try? await Task.sleep(nanoseconds: 200_000_000); return 2 }
Task {
async let a = loadA()
async let b = loadB()
// Both start immediately; awaiting joins them
let sum = await (a + b)
print("sum =", sum) // 3
}Независимая задача
Используйте Task {}, чтобы запустить независимую задачу, а затем await t.value, чтобы получить её результат.
// Create an independent task (not tied to current scope)
func fetchMessage() async -> String {
try? await Task.sleep(nanoseconds: 150_000_000)
return "hello"
}
let t = Task { await fetchMessage() }
Task {
print("from Task:", await t.value) // waits for the independent task's result
}Основы отмены
Отмена выполняется кооперативно. Выполните проверку с помощью Task.checkCancellation() (она выбрасывает ошибку) или прочитайте Task.isCancelled и завершите работу раньше.
// A long-running job that checks for cancellation
enum WorkError: Error { case cancelled }
func longJob() async throws -> Int {
var total = 0
for i in 1...10 {
try Task.checkCancellation() // throws CancellationError if cancelled
try? await Task.sleep(nanoseconds: 50_000_000)
total += i
}
return total
}
let job = Task { try await longJob() }
Task {
// Cancel after a short delay
try? await Task.sleep(nanoseconds: 120_000_000)
job.cancel()
do {
_ = try await job.value
} catch {
print("job cancelled") // expected
}
}Отмена от родителя к детям
Когда родительская задача отменяется, дочерние задачи узнают об этом и должны быстро завершиться после проверки.
// Propagate cancellation from parent to children using async let
func part(_ id: Int) async throws -> String {
try Task.checkCancellation()
try? await Task.sleep(nanoseconds: 80_000_000)
return "P\(id)"
}
Task {
do {
async let p1 = part(1)
async let p2 = part(2)
// Cancel the whole operation before awaiting
Task.currentTask?.cancel() // cancel self -> children see cancellation
let out = try await [p1, p2].joined(separator: ",")
print(out)
} catch {
print("parent cancelled; children stopped")
}
}Рекомендации
Советы:
- Используйте async let для параллельных задач одного уровня; всегда ожидайте их в той же области видимости.
- Отменяйте задачу с помощью
task.cancel(), а внутри работы вызывайтеTask.checkCancellation(). - Предпочитайте небольшие асинхронные функции: их легко отменять и тестировать.
Поведение при кооперативной отмене
Быстрая проверка: как должен реагировать длительный асинхронный код на отмену?
Итоги
Итоги: запускайте параллельные задачи одного уровня с помощью async let, запускайте независимую работу через Task {} и реализуйте кооперативную отмену, своевременно выполняя проверки и завершая работу.
Часто задаваемые вопросы
Урок «async let, Task и отмена» бесплатный?
Да — полный текст урока «async let, Task и отмена» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 3 уроков всего.
Чему я научусь в уроке «async let, Task и отмена»?
Запускайте работу параллельно с помощью async let , создавайте независимые задачи Task и обрабатывайте отмену совместно с вызывающим кодом. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 3.
Сколько времени занимает урок «async let, Task и отмена»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Структурированный параллелизм и асинхронные функции
- async let, Task и отмена
- try await и распространение ошибок