Sobes.tech
Middle

Jaké způsoby existují pro umístění úkolů do fronty Grand Central Dispatch (GCD)?

sobes.tech AI

Odpověď od AI

Existují následující způsoby umístění úloh do fronty GCD:

  1. Asynchronní provádění (async): Úloha je přidána do fronty a provádění pokračuje okamžitě na aktuálním vlákně, aniž by čekalo na dokončení úlohy ve frontě.

    DispatchQueue.global().async {
        // Kód úlohy
    }
    
  2. Synchronní provádění (sync): Úloha je přidána do fronty a aktuální vlákno je zablokováno, dokud úloha ve frontě neskončí. Vyhněte se používání sync na hlavním vlákně pro dlouhotrvající úlohy, aby nedošlo k zablokování UI.

    DispatchQueue.global().sync {
        // Kód úlohy, aktuální vlákno bude čekat
    }
    
  3. Odložené provádění (asyncAfter): Úloha je přidána do fronty s uvedeným zpožděním. Provádění začne nejdříve za uvedený čas.

    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        // Kód úlohy se provede za 2 sekundy
    }
    
  4. Provádění ve skupině (DispatchGroup): Úlohy mohou být přidány do DispatchGroup pro synchronizaci jejich dokončení. Můžete počkat na dokončení všech nebo být upozorněni (notify) po jejich dokonč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šechny úlohy ve skupině jsou dokončeny
    }
    
  5. Provádění iterací (concurrentPerform): Umožňuje spustit blok kódu iterations krát paralelně na konkurenční frontě.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Kód, který se provádí pro každý index paralelně
    }
    
  6. DispatchWorkItem: Obaluje blok kódu a umožňuje zrušit úlohu před jejím začátkem nebo po jejím přidání do fronty, pokud ještě nezačala.

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Kód úlohy
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // Úlohu lze zrušit, pokud ještě nezačala
    // workItem?.cancel()