Вы не можете отменить, потому что
1) почти все время рабочие элементы выполняются в основной очереди (UI), поэтому заблокируйте его
2) внутри рабочего элемента нет проверки для isCancelled
. DispatchWorkItem.cancel () только помечает его как отмененный, но не останавливает выполнение, вы должны сделать это.
Так что для выполнения этой работы необходимо перенаправить все не-пользовательские интерфейсы, связанные с вашим рабочим элементом, в очередь .background
явно.
Например. вместо
DispatchQueue.main.asyncAfter(deadline: .init(uptimeNanoseconds: 0), execute: self.workItem)
используйте
DispatchQueue.global(qos: .background).async { self.workItem }
Вместо
DispatchQueue.global().async {
if (self.pm.MarksSwitch)
Просто используйте (потому что он уже в фоновом режиме)
if (self.pm.MarksSwitch)
и я не уверен, что это такое (вероятно, его также следует запускать в фоновой очереди)
self.tm.start()
И во второй раз добавить прерывание внутреннего блока при отмене обычной проверкой, как показано ниже
...
}
if self.workItem.isCancelled { // add as many such as needed
return
}
if (self.pm.ReadySwitch)
...