Junior — Middle
Da li je moguće otkazati izvršenje zadatka prilikom korišćenja GCD u iOS?
sobes.tech АИ
Одговор од АИ
U GCD (Grand Central Dispatch) na iOS, direktno otkazivanje zadatka nije moguće ako je zadatak već pokrenut. GCD ne pruža ugrađeni mehanizam za prekidanje trenutno izvršnog bloka.
Međutim, može se implementirati indirektno otkazivanje:
- Koristeći zastavice ili promenljive stanja koje se proveravaju unutar bloka zadatka i, ako je potrebno, ranije završavaju izvršenje.
- Za asinhrone operacije, koristiti DispatchWorkItem koji podržava metodu cancel(). Otkaivanje putem DispatchWorkItem sprečava pokretanje zadatka ako još nije započeo.
Primer sa DispatchWorkItem:
let workItem = DispatchWorkItem {
for i in 0..<1000 {
if workItem.isCancelled {
print("Zadatak otkazan")
return
}
// Izvršavanje rada
print(i)
}
}
DispatchQueue.global().async(execute: workItem)
// Otkaži zadatak
workItem.cancel()
Na ovaj način, otkazivanje je moguće pre početka izvršenja ili unutar zadatka proverom zastavice, ali nije moguće prekinuti već izvršeni blok u GCD.