Middle
Πες μου για τον μηχανισμό ακύρωσης στο DispatchWorkItem.
sobes.tech AI
Απάντηση από AI
DispatchWorkItem αντιπροσωπεύει ένα μπλοκ κώδικα που μπορεί να προγραμματιστεί για εκτέλεση σε μια ουρά dispatch, και μπορεί να ακυρωθεί πριν από την πραγματική εκτέλεσή του.
Η ακύρωση υλοποιείται μέσω μιας σημαίας μέσα στο DispatchWorkItem. Ο μηχανισμός ακύρωσης είναι συνεργατικός: το DispatchWorkItem πρέπει να ελέγχει τακτικά την κατάσταση ακύρωσής του.
Κατά την κλήση της μεθόδου cancel() στο DispatchWorkItem, ορίζεται η σημαία ακύρωσης. Η πραγματική διακοπή της εκτέλεσης συμβαίνει μόνο αν, μέσα στο μπλοκ κώδικα του DispatchWorkItem, ελέγχεται αυτή η σημαία μέσω της ιδιότητας isCancelled.
Παράδειγμα χρήσης:
let εργασία: DispatchWorkItem = DispatchWorkItem {
for i in 0..<100 {
guard !self.isCancelled else { // Έλεγχος σημαίας ακύρωσης
print("Ενέργεια ακυρώθηκε στη επανάληψη \(i)")
return // Τερματισμός εκτέλεσης
}
// Εκτέλεση χρήσιμης εργασίας
Thread.sleep(forTimeInterval: 0.1) // Προσομοίωση μακράς λειτουργίας
}
print("Ενέργεια ολοκληρώθηκε")
}
DispatchQueue.global().async(execute: εργασία)
// Ακύρωση εργασίας μετά από 1 δευτερόλεπτο
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
εργασία.cancel()
}
Βασικά σημεία:
- Η άμεση ακύρωση δεν εγγυάται; εξαρτάται από το πόσο συχνά ελέγχεται το
isCancelledμέσα στο μπλοκ. - Ένα
DispatchWorkItemπου έχει ακυρωθεί μπορεί να τοποθετηθεί στη σειρά, αλλά το μπλοκ του δεν θα εκτελεστεί αν τοisCancelledελεγχθεί πριν από την έναρξη. - Η κλήση
cancel()σε ένα ήδη εκτελεσμένο ή ακυρωμένοDispatchWorkItemδεν έχει αποτέλεσμα.
Ιδιότητες:
| Ιδιότητα | Τύπος | Περιγραφή |
|---|---|---|
isCancelled |
Bool |
Επιστρέφει true αν η εργασία έχει ακυρωθεί. |