Sobes.tech
Middle

Aké spôsoby existujú na umiestnenie úloh do fronty Grand Central Dispatch (GCD)?

sobes.tech AI

Odpoveď od AI

Existujú nasledujúce spôsoby umiestnenia úloh do frontu GCD:

  1. Asynchrónne vykonávanie (async): Úloha sa pridá do frontu a vykonávanie okamžite pokračuje na aktuálnom vlákne, bez čakania na dokončenie úlohy vo fronte.

    DispatchQueue.global().async {
        // Kód úlohy
    }
    
  2. Synchrónne vykonávanie (sync): Úloha sa pridá do frontu a aktuálne vlákno sa zablokuje, kým sa úloha vo fronte nedokončí. Vyhnite sa používaniu sync na hlavnom vlákne pre úlohy, ktoré trvajú dlhý čas, aby ste nezablokovali UI.

    DispatchQueue.global().sync {
        // Kód úlohy, aktuálne vlákno bude čakať
    }
    
  3. Odložené vykonávanie (asyncAfter): Úloha sa pridá do frontu s uvedeným oneskorením. Vykonanie začne najskôr po uvedenom čase.

    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        // Kód úlohy sa vykoná o 2 sekundy
    }
    
  4. Vykonávanie v skupine (DispatchGroup): Úlohy môžu byť pridané do DispatchGroup na synchronizáciu ich ukončenia. Môžete počkať na dokončenie všetkých alebo byť upozornení (notify) po ich ukončení.

    let group = DispatchGroup()
    
    group.enter()
    DispatchQueue.global().async {
        // Úloha 1
        group.leave()
    }
    
    group.enter()
    DispatchQueue.global().async {
        // Úloha 2
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Všetky úlohy v skupine sú ukončené
    }
    
  5. Použitie iterácií (concurrentPerform): Umožňuje vykonať zadaný blok kódu iterations krát paralelne na konkurenčnej fronte.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Kód, ktorý sa vykoná pre každý index paralelne
    }
    
  6. DispatchWorkItem: Obaluje blok kódu a umožňuje zrušiť vykonanie úlohy pred jej začatím alebo po jej pridaní do frontu, ak ešte nezačala vykonávať.

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Kód úlohy
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // Môžete zrušiť úlohu, ak ešte nezačala
    // workItem?.cancel()