Sobes.tech
Junior — Middle

Ar galima sustabdyti užduoties vykdymą GCD prieš jos pabaigą?

sobes.tech AI

Atsakymas iš AI

GCD (Grand Central Dispatch) sistemoje nėra galimybės tiesiogiai nutraukti jau pradėtos užduoties. Užduotys, siunčiamos į eilę, vykdomos iki jų pabaigos.

Tačiau, galima įgyvendinti užduoties atšaukimą netiesiogiai:

  • Asinchroninėms užduotims naudokite DispatchWorkItem, kuris palaiko cancel() metodą. Patys užduotys turėtų periodiškai tikrinti isCancelled savybę ir tinkamai užbaigti, jei atšaukimas yra prašomas.

Pavyzdys:

let workItem = DispatchWorkItem {
    for i in 0..<1000 {
        if workItem.isCancelled {
            print("Užduotis atšaukta")
            return
        }
        // Atlikti darbą
    }
}

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

// Vėliau
workItem.cancel()

Taigi, atšaukimas įmanomas tik jei užduotis palaiko atšaukimo patikrinimą, kitaip ją uždrausti priverstinai neįmanoma.