Sobes.tech
Junior — Middle

Je možné prerušiť vykonávanie úlohy v GCD pred jej dokončením?

sobes.tech AI

Odpoveď od AI

V GCD (Grand Central Dispatch) nie je možné priamo prerušiť už spustenú úlohu. Úlohy odoslané do frontu sa vykonávajú až do dokončenia.

Avšak, je možné implementovať jej zrušenie nepriamo:

  • Pre asynchrónne úlohy použite DispatchWorkItem, ktorý podporuje metódu cancel(). Samotná úloha by mala pravidelne kontrolovať vlastnosť isCancelled a správne ukončiť, ak je požadované zrušenie.

Príklad:

let workItem = DispatchWorkItem {
    for i in 0..<1000 {
        if workItem.isCancelled {
            print("Úloha zrušená")
            return
        }
        // Vykonanie práce
    }
}

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

// Neskôr
workItem.cancel()

Týmto spôsobom je možné zrušenie iba v prípade, že úloha podporuje kontrolu zrušenia, inak ju nemožno nútene prerušiť.