Middle
Opowiedz mi o mechanizmie anulowania w DispatchWorkItem.
sobes.tech AI
Odpowiedź od AI
DispatchWorkItem reprezentuje blok kodu, który można zaplanować do wykonania w kolejce dispatch, i który może zostać anulowany przed jego faktycznym wykonaniem.
Anulowanie jest realizowane za pomocą flagi wewnątrz DispatchWorkItem. Mechanizm anulowania jest kooperatywny: DispatchWorkItem musi regularnie sprawdzać swój stan anulowania.
Po wywołaniu metody cancel() na DispatchWorkItem, ustawiana jest flaga anulowania. Faktyczne przerwanie wykonania następuje tylko wtedy, gdy wewnątrz bloku kodu DispatchWorkItem sprawdzana jest ta flaga za pomocą właściwości isCancelled.
Przykład użycia:
let zadanie: DispatchWorkItem = DispatchWorkItem {
for i in 0..<100 {
guard !self.isCancelled else { // Sprawdzenie flagi anulowania
print("Operacja anulowana na iteracji \(i)")
return // Zakończenie wykonania
}
// Wykonanie przydatnej pracy
Thread.sleep(forTimeInterval: 0.1) // Symulacja długiej operacji
}
print("Operacja zakończona")
}
DispatchQueue.global().async(execute: zadanie)
// Anuluj pracę po 1 sekundzie
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
zadanie.cancel()
}
Kluczowe punkty:
- Natychmiastowe anulowanie nie jest gwarantowane; zależy od częstotliwości sprawdzania
isCancelledwewnątrz bloku. - Anulowane
DispatchWorkItemmoże zostać dodane do kolejki, ale jego blok nie zostanie wykonany, jeśliisCancelledzostanie sprawdzone przed rozpoczęciem. - Wywołanie
cancel()na już wykonanym lub anulowanymDispatchWorkItemnie ma efektu.
Właściwości:
| Właściwość | Typ | Opis |
|---|---|---|
isCancelled |
Bool |
Zwraca true, jeśli praca została anulowana. |