Middle
Ispričaj mi o mehanizmu otkazivanja u DispatchWorkItem.
sobes.tech АИ
Одговор од АИ
DispatchWorkItem predstavlja blok koda koji se može planirati za izvršenje u red dispatch-a, i koji može biti otkazan pre njegovog stvarnog izvršenja.
Otkaz se implementira pomoću zastavice unutar DispatchWorkItem. Mehanizam otkazivanja je kooperativan: DispatchWorkItem mora redovno proveravati svoj status otkazivanja.
Pozivom metode cancel() na DispatchWorkItem, postavlja se zastavica otkazivanja. Stvarno prekidanje izvršenja dešava se samo ako se unutar bloka koda DispatchWorkItem proveri ta zastavica pomoću svojstva isCancelled.
Primer upotrebe:
let zadatak: DispatchWorkItem = DispatchWorkItem {
for i in 0..<100 {
guard !self.isCancelled else { // Provera zastavice otkazivanja
print("Operacija otkazana na iteraciji \(i)")
return // Završetak izvršenja
}
// Obavljanje korisnog rada
Thread.sleep(forTimeInterval: 0.1) // Simulacija duge operacije
}
print("Operacija završena")
}
DispatchQueue.global().async(execute: zadatak)
// Otkazivanje posla nakon 1 sekunde
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
zadatak.cancel()
}
Ključne tačke:
- Neposredno otkazivanje nije garantovano; zavisi od učestalosti provere
isCancelledunutar bloka. - Otkaženi
DispatchWorkItemmože biti stavljen u red, ali njegov blok neće biti izvršen ako jeisCancelledprovereno pre početka. - Pozivanje
cancel()na već izvršen ili otkazanDispatchWorkItemnema efekta.
Svojstva:
| Svojstvo | Tip | Opis |
|---|---|---|
isCancelled |
Bool |
Vraća true ako je posao otkazan. |