Sobes.tech
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 isCancelled wewnątrz bloku.
  • Anulowane DispatchWorkItem może zostać dodane do kolejki, ale jego blok nie zostanie wykonany, jeśli isCancelled zostanie sprawdzone przed rozpoczęciem.
  • Wywołanie cancel() na już wykonanym lub anulowanym DispatchWorkItem nie ma efektu.

Właściwości:

Właściwość Typ Opis
isCancelled Bool Zwraca true, jeśli praca została anulowana.