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:
-
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 } -
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 } -
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 } -
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 } -
Executarea iterațiilor (concurrentPerform): Permite executarea unui bloc de cod
iterationsori în paralel pe o coadă concurentă.DispatchQueue.concurrentPerform(iterations: 100) { index in // Cod care se execută pentru fiecare index în paralel } -
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()