Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Swift : concurrency, cancellation

Как отменить асинхронную задачу?

Вопрос проверяет знание механизмов отмены асинхронных операций, которые еще не завершились.

Короткий ответ

Способ отмены зависит от API, используемого для задачи. Для операций URLSessionDataTask можно вызвать метод cancel(). Для кода, использующего DispatchQueue, отмена не предусмотрена нативно, но можно реализовать флаги проверки (isCancelled). Наиболее современный способ — использование фреймворка Combine с его Cancellable протоколом или async/await с Task и ее методом cancel().

Длинный ответ

1. Отмена URLSessionTask:
Задачи сетевого запроса, созданные через URLSession, можно отменить прямым вызовом метода.

let task = URLSession.shared.dataTask(with: url) { data, _, _ in
    // Обработка данных
}
task.resume()

// Где-то позже, если нужно отменить запрос:
task.cancel() // Задача перейдет в состояние "cancelled".

2. Отмена с помощью флага (для DispatchQueue):
Поскольку GCD не предоставляет встроенного механизма отмены, используется проверка флага внутри замыкания.

class CancellableTask {
    private var isCancelled = false

    func startTask() {
        DispatchQueue.global().async { [weak self] in
            // Периодически проверяем флаг
            while !(self?.isCancelled ?? true) {
                // Выполняем работу...
                if self?.isCancelled == true { break }
            }
        }
    }

    func cancel() {
        isCancelled = true
    }
}

3. Отмена с помощью async/await (Swift 5.5+):
С появлением структурированного параллелизма для отмены используется Task.

let task = Task {
    // Проверяем, не отменена ли уже задача
    try Task.checkCancellation()
    // Или проверяем свойство
    guard !Task.isCancelled else { return }
    // Выполняем работу...
}

// Для отмены
task.cancel()
  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    1

  • Сложность:

    7

Навыки

  • Swift

    Swift

Ключевые слова

#concurrency

#cancellation

Подпишись на iOS Developer в телеграм

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.