Sobes.tech
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.