Middle
Ποια εργαλεία διατίθενται στο Grand Central Dispatch (GCD);
sobes.tech AI
Απάντηση από AI
Βασικά εργαλεία του GCD:
- Αποθέματα dispatch (Dispatch Queues): Διαχειρίζονται την εκτέλεση μπλοκ κώδικα. Μπορούν να είναι:
- Συνεχόμενα (Serial): Εκτελούν εργασίες μία κάθε φορά, διασφαλίζοντας τη σειρά.
- Ταυτόχρονα (Concurrent): Εκτελούν εργασίες ταυτόχρονα (εντός των διαθέσιμων πόρων του συστήματος).
- Παγκόσμια ταυτόχρονα αποθέματα (Global Concurrent Queues): Παρέχονται από το σύστημα, έχουν προκαθορισμένες προτεραιότητες (κλάσεις ποιότητας υπηρεσίας - QoS).
- Κύρια ουρά (Main Queue): Μια ειδική συνεχή ουρά που συνδέεται με το κύριο νήμα της εφαρμογής. Χρησιμοποιείται για εργασίες με UI.
- Ομάδες dispatch (Dispatch Groups): Επιτρέπουν την παρακολούθηση της ολοκλήρωσης ενός συνόλου ασύγχρονων εργασιών.
- Σημασιολογία φραγμού (Barrier Semantics): Για ταυτόχρονες ουρές, επιτρέπει τη δημιουργία ενός "φραγμού", μετά τον οποίο εκτελούνται μόνο οι εργασίες που τοποθετούνται μετά τον φραγμό, μέχρι να ξεπεραστεί.
- Πηγές dispatch (Dispatch Sources): Επιτρέπουν την αντίδραση σε συστημικά γεγονότα (λειτουργίες αρχείων, σήματα, χρονοδιακόπτες κ.ά.).
- DispatchWorkItem: Τυλίγει ένα μπλοκ κώδικα και μπορεί να αποσταλεί σε ουρά, να ακυρωθεί και να ειδοποιηθεί κατά την ολοκλήρωση.
Παράδειγμα δημιουργίας συνεπούς ουράς και εκτέλεσης εργασίας:
let serialQueue = DispatchQueue(label: "com.example.serialQueue")
serialQueue.async {
// Εκτελείται ασύγχρονα σε συνεπή ουρά
print("Εργασία εκτελέστηκε σε συνεπή ουρά")
}
Παράδειγμα χρήσης ομάδας dispatch:
let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
group.enter() // Είσοδος στην ομάδα
concurrentQueue.async {
// Εργασία 1
print("Εργασία 1 ολοκληρώθηκε")
group.leave() // Έξοδος από την ομάδα
}
group.enter() // Είσοδος στην ομάδα
concurrentQueue.async {
// Εργασία 2
print("Εργασία 2 ολοκληρώθηκε")
group.leave() // Έξοδος από την ομάδα
}
group.notify(queue: .main) {
// Εκτελείται μετά την ολοκλήρωση όλων των εργασιών στην ομάδα
print("Όλες οι εργασίες στην ομάδα ολοκληρώθηκαν")
}
Παράδειγμα χρήσης DispatchWorkItem:
let workItem = DispatchWorkItem {
print("WorkItem εκτελέστηκε")
}
DispatchQueue.global().async(execute: workItem)
// workItem.cancel() // Μπορεί να ακυρωθεί πριν την εκτέλεση