Sobes.tech
Middle

Ποιοι τρόποι υπάρχουν για την τοποθέτηση εργασιών στη ουρά του Grand Central Dispatch (GCD);

sobes.tech AI

Απάντηση από AI

Υπάρχουν οι ακόλουθοι τρόποι τοποθέτησης εργασιών στη σειρά GCD:

  1. Ασύγχρονη εκτέλεση (async): Η εργασία προστίθεται στη σειρά και η εκτέλεση συνεχίζεται αμέσως στο τρέχον νήμα, χωρίς να περιμένει την ολοκλήρωση της εργασίας στη σειρά.

    DispatchQueue.global().async {
        // Κώδικας εργασίας
    }
    
  2. Συγχρονική εκτέλεση (sync): Η εργασία προστίθεται στη σειρά και το τρέχον νήμα μπλοκάρεται μέχρι να ολοκληρωθεί η εργασία. Αποφύγετε τη χρήση sync στο κύριο νήμα για εργασίες μεγάλης διάρκειας, ώστε να μην μπλοκάρει το UI.

    DispatchQueue.global().sync {
        // Κώδικας εργασίας, το τρέχον νήμα θα περιμένει
    }
    
  3. Καθυστερημένη εκτέλεση (asyncAfter): Η εργασία προστίθεται στη σειρά με καθορισμένη καθυστέρηση. Η εκτέλεση θα ξεκινήσει όχι νωρίτερα από τον καθορισμένο χρόνο.

    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        // Ο κώδικας εργασίας θα εκτελεστεί σε 2 δευτερόλεπτα
    }
    
  4. Εκτέλεση σε ομάδα (DispatchGroup): Οι εργασίες μπορούν να προστεθούν σε μια DispatchGroup για συγχρονισμό της ολοκλήρωσής τους. Μπορείτε να περιμένετε μέχρι να ολοκληρωθούν όλες ή να ειδοποιηθείτε (notify) μετά την ολοκλήρωσή τους.

    let group = DispatchGroup()
    
    group.enter()
    DispatchQueue.global().async {
        // Εργασία 1
        group.leave()
    }
    
    group.enter()
    DispatchQueue.global().async {
        // Εργασία 2
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Όλες οι εργασίες στην ομάδα έχουν ολοκληρωθεί
    }
    
  5. Εκτέλεση επαναλήψεων (concurrentPerform): Επιτρέπει την εκτέλεση ενός μπλοκ κώδικα iterations φορές παράλληλα σε μια ανταγωνιστική σειρά.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Κώδικας που εκτελείται για κάθε δείκτη παράλληλα
    }
    
  6. DispatchWorkItem: Τυλίγει ένα μπλοκ κώδικα και επιτρέπει την ακύρωση της εργασίας πριν ξεκινήσει ή μετά την προσθήκη στη σειρά, αν δεν έχει ξεκινήσει ακόμα.

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Κώδικας εργασίας
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // Μπορείτε να ακυρώσετε την εργασία αν δεν έχει ξεκινήσει ακόμα
    // workItem?.cancel()