Sobes.tech
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() // Μπορεί να ακυρωθεί πριν την εκτέλεση