Sobes.tech
Middle

Papaskinkite apie atšaukimo mechanizmą DispatchWorkItem.

sobes.tech AI

Atsakymas iš AI

DispatchWorkItem yra kodo blokas, kurį galima suplanuoti vykdyti dispečerio eilėje, ir kurį galima atšaukti iki jo faktinio vykdymo.

Atšaukimas įgyvendinamas per DispatchWorkItem viduje esantį žymeklį. Atšaukimo mechanizmas yra kooperatyvus: DispatchWorkItem pats turi reguliariai tikrinti savo atšaukimo būseną.

Kviečiant cancel() metodą DispatchWorkItem, žymeklis nustatomas kaip atšauktas. Faktinis vykdymo nutraukimas įvyksta tik tada, kai kodo bloke atliekama šio žymeklio patikra naudojant isCancelled savybę.

Naudojimo pavyzdys:

let darbas: DispatchWorkItem = DispatchWorkItem {
    for i in 0..<100 {
        guard !savarankiškaiVykdomasObjektas.isCancelled else { // Atšaukimo žymeklio patikra
            print("Operacija atšaukta iteracijoje \(i)")
            return // Vykdymo pabaiga
        }
        // Naudingos darbo atlikimas
        Thread.sleep(forTimeInterval: 0.1) // Ilgos operacijos imitacija
    }
    print("Operacija baigta")
}

DispatchQueue.global().async(execute: darbas)

// Atšaukti darbą po 1 sekundės
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
    darbas.cancel()
}

Pagrindiniai punktai:

  • Nedelsiant atšaukimas nėra garantuotas; priklauso nuo isCancelled patikros dažnumo bloke.
  • Atšauktas DispatchWorkItem gali būti įtrauktas į eilę, tačiau jo blokas nebus vykdomas, jei isCancelled bus patikrintas prieš pradėdami vykdyti.
  • cancel() iškvietimas jau įvykdytam ar atšauktam DispatchWorkItem neturi įtakos.

Savybės:

Savybė Tipas Aprašymas
isCancelled Bool Grąžina true, jei darbas atšauktas.