Junior — Middle
Ar įmanoma nutraukti GCD pagalba pradėtos užduoties vykdymą jos vykdymo metu?
sobes.tech AI
Atsakymas iš AI
GCD (Grand Central Dispatch) neturi įmontuoto mechanizmo, kuris priverstinai sustabdytų jau vykdomą užduotį. Kai užduotis (blokas) pradeda vykdyti, jos iš išorės nutraukti neįmanoma.
Norint įgyvendinti galimybę atšaukti, reikia patiems numatyti patikrą dėl atšaukimo vėliavos pačioje užduotyje. Pavyzdžiui, naudoti atominę kintamąjį arba vėliavą, kuri periodiškai tikrinama vykdymo metu ir, jei reikia, leidžia anksti užbaigti darbą.
Pavyzdys:
var isCancelled = false
dispatchQueue.async {
for i in 0..<1000 {
if isCancelled {
print("Užduotis atšaukta")
break
}
// Atlikti dalį darbo
}
}
// Kitoje vietoje
isCancelled = true
Jei reikalingas lankstesnis atšaukimas, apsvarstykite Operation ir OperationQueue naudojimą, kurie turi įmontuotą paramą užduočių atšaukimui.