Назад к вопросам
Middle
138
questionbank

Расскажи о механизме отмены в DispatchWorkItem.

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

DispatchWorkItem представляет собой блок кода, который можно спланировать для выполнения в очереди диспетчеризации, и при этом его можно отменить до его фактического выполнения.

Отмена реализована через флаг внутри DispatchWorkItem. Механизм отмены коопративный: DispatchWorkItem сам должен регулярно проверять свой статус отмены.

При вызове метода cancel() у DispatchWorkItem, устанавливается флаг отмены. Фактическое прерывание выполнения происходит только в том случае, если внутри блока кода DispatchWorkItem выполняется проверка этого флага с помощью свойства isCancelled.

Пример использования:

let 작업: DispatchWorkItem = DispatchWorkItem {
    for i in 0..<100 {
        guard !самостоятельноВыполняемыйОбъект.isCancelled else { // Проверка флага отмены
            print("Операция отменена на итерации \(i)")
            return // Завершение выполнения
        }
        // Выполнение полезной работы
        Thread.sleep(forTimeInterval: 0.1) // Имитация долгой операции
    }
    print("Операция завершена")
}

DispatchQueue.global().async(execute: 작업)

// Отменяем работу через 1 секунду
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
    задача.cancel()
}

Ключевые моменты:

  • Немедленная отмена не гарантируется; зависит от частоты проверки isCancelled внутри блока.
  • Отмененный DispatchWorkItem может быть поставлен в очередь, но его блок не будет выполнен, если isCancelled будет проверен до начала выполнения.
  • Вызов cancel() на уже выполненном или отмененном DispatchWorkItem не имеет эффекта.

Свойства:

Свойство Тип Описание
isCancelled Bool Возвращает true, если работа отменена.