Sobes.tech
Junior

Ce este GCD (Grand Central Dispatch) în contextul dezvoltării iOS?

sobes.tech AI

Răspuns de la AI

GCD (Grand Central Dispatch) este o API de nivel scăzut de la Apple pentru gestionarea operațiunilor paralele și executarea asincronă a codului în aplicații. Oferă un mecanism pentru trimiterea sarcinilor în cozi de execuție, gestionate de sistem.

Caracteristici cheie:

  • Cozi de sarcini (Dispatch Queues): structuri FIFO în care sunt adăugate blocuri de cod (closures) pentru execuție.
    • Derivă din tipuri concurrente (paralel) și seriale (secvențiale).
    • Oferă cozi globale de sistem și permit crearea de cozi personalizate.
  • Blocuri (Blocks): unități de lucru trimise în cozi.
  • Gestionarea firelor de execuție: abstractizează dezvoltatorul de gestionarea directă a firelor, permițând sistemului să distribuie sarcinile în mod optim între nucleele procesorului disponibile.
  • Priorități: permit specificarea unei priorități pentru sarcini în cozi globale concurrente.

Tipuri de cozi:

  • Seriale (secuențiale): execută sarcinile strict una câte una, în ordinea adăugării. Garantat că doar o sarcină din această coadă se execută în orice moment.
    • Coada principală (DispatchQueue.main) este o coadă serială specială pentru actualizări UI.
    • Cozi seriale personalizate.
  • Concurrente: pot executa mai multe sarcini simultan (în paralel), fără a garanta ordinea finalizării.
    • Cozi globale concurrente cu diferite niveluri de calitate a serviciului (QoS).
    • Cozi concurrente personalizate.

Niveluri de calitate a serviciului (QoS) pentru cozi globale concurrente:

Nivel QoS Descriere Exemple de utilizare
userInteractive Sarcini cu care interacționează activ utilizatorul. Animații, procesarea evenimentelor UI.
userInitiated Sarcini inițiate de utilizator, care necesită rezultat imediat. Încărcarea conținutului la apăsarea unui buton.
utility Sarcini care durează mult și nu necesită rezultat imediat. Încărcarea datelor, procesarea imaginilor în fundal.
background Sarcini în fundal, invizibile pentru utilizator. Actualizarea cache-ului, sincronizarea datelor.
unspecified Nivelul QoS nu este specificat, sistemul îl determină singur. API-uri vechi sau sarcini de nivel scăzut ale sistemului.

Exemplu simplu de utilizare:

// Executați o sarcină în fundal (coadă concurentă globală)
DispatchQueue.global(qos: .userInitiated).async {
    // Executați o operație de durată lungă
    print("Executare sarcină în fundal")

    // Revenirea pe thread-ul principal pentru actualizarea UI
    DispatchQueue.main.async {
        print("Actualizare UI pe thread-ul principal")
    }
}

GCD simplifică lucrul cu multitreading-ul și paralelismul, făcând codul mai ușor de citit și mai puțin predispus la erori de race conditions comparativ cu gestionarea de fire de nivel scăzut (Thread).