Sobes.tech
Middle

Ce metode există pentru plasarea sarcinilor în coada Grand Central Dispatch (GCD)?

sobes.tech AI

Răspuns de la AI

Următoarele sunt modalitățile de plasare a sarcinilor în coada GCD:

  1. Executare asincronă (async): Sarcina este adăugată în coadă, iar execuția continuă imediat pe firul curent, fără a aștepta finalizarea sarcinii din coadă.

    DispatchQueue.global().async {
        // Codul sarcinii
    }
    
  2. Executare sincronă (sync): Sarcina este adăugată în coadă, iar firul curent este blocat până când sarcina din coadă se finalizează. Evitați utilizarea sync pe firul principal pentru sarcini de durată lungă pentru a nu bloca UI-ul.

    DispatchQueue.global().sync {
        // Codul sarcinii, firul curent va aștepta
    }
    
  3. Executare întârziată (asyncAfter): Sarcina este adăugată în coadă cu o întârziere specificată. Execuția va începe nu mai devreme de timpul indicat.

    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        // Codul sarcinii va fi executat după 2 secunde
    }
    
  4. Executare în grup (DispatchGroup): Sarcinile pot fi adăugate într-un DispatchGroup pentru a sincroniza finalizarea lor. Se poate aștepta finalizarea tuturor sau se poate fi notificat (notify) după finalizare.

    let group = DispatchGroup()
    
    group.enter()
    DispatchQueue.global().async {
        // Sarcina 1
        group.leave()
    }
    
    group.enter()
    DispatchQueue.global().async {
        // Sarcina 2
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Toate sarcinile din grup au fost finalizate
    }
    
  5. Executarea iterațiilor (concurrentPerform): Permite executarea unui bloc de cod iterations ori în paralel pe o coadă concurentă.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Cod care se execută pentru fiecare index în paralel
    }
    
  6. DispatchWorkItem: Învelește un bloc de cod și permite anularea sarcinii înainte de a începe sau după ce a fost adăugată în coadă, dacă nu a început încă.

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Codul sarcinii
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // Se poate anula sarcina dacă nu a început încă
    // workItem?.cancel()