Вопрос проверяет знание механизмов отмены асинхронных операций, которые еще не завершились.
Способ отмены зависит от 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()