Sobes.tech
Junior

Čo je GCD (Grand Central Dispatch) v kontexte vývoja na iOS?

sobes.tech AI

Odpoveď od AI

GCD (Grand Central Dispatch) je nízkoúrovňové API od Apple na správu paralelných operácií a asynchrónne vykonávanie kódu v aplikáciách. Poskytuje mechanizmus na odosielanie úloh do frontov vykonávania, ktoré systém spravuje.

Kľúčové vlastnosti:

  • Fronty úloh (Dispatch Queues): FIFO štruktúry, do ktorých sa pridávajú bloky kódu (closures) na vykonanie.
    • Vychádzajú z typov concurrent (paralelné) a serial (sekvenčné).
    • Poskytujú globálne systémové fronty a umožňujú vytváranie vlastných.
  • Bloky (Blocks): Jednotky práce, ktoré sa odosielajú do frontov.
  • Správa vlákien: Skrýva správu vlákien od vývojára, umožňuje systému optimálne rozdeľovať úlohy na dostupné procesorové jadrá.
  • Prioritné úrovne: Umožňuje určiť prioritu pre úlohy v systémových globálnych concurrent frontoch.

Typy frontov:

  • Serial (sekvenčné): Vykonávajú úlohy presne po jednej, v poradí ich pridania. Zaručujú, že len jedna úloha z tejto fronty sa vykonáva v danom momente.
    • Hlavná fronta (DispatchQueue.main) — špeciálna serial fronta pre UI aktualizácie.
    • Vlastné serial fronty.
  • Concurrent (paralelné): Môžu vykonávať viac úloh súčasne, poradie dokončenia nie je garantované.
    • Systémové globálne concurrent fronty s rôznymi úrovňami kvality služby (QoS).
    • Vlastné concurrent fronty.

Úrovne kvality služby (QoS) pre globálne concurrent fronty:

Úroveň QoS Popis Príklady použitia
userInteractive Úlohy, s ktorými aktívne interaguje používateľ. Animácie, spracovanie UI udalostí.
userInitiated Úlohy spustené používateľom, ktoré vyžadujú okamžitý výsledok. Načítanie obsahu po stlačení tlačidla.
utility Dlhodobejšie úlohy, ktoré nevyžadujú okamžitý výsledok. Načítanie dát, spracovanie obrázkov na pozadí.
background Úlohy, ktoré prebiehajú na pozadí, neviditeľné pre používateľa. Aktualizácia cache, synchronizácia dát.
unspecified Úroveň QoS nie je uvedená, systém ju určuje sám. Starší API alebo nízkoúrovňové systémové úlohy.

Príklad použitia:

// Spustenie úlohy na pozadí (globálna concurrent fronta)
DispatchQueue.global(qos: .userInitiated).async {
    // Vykonanie dlhodobej operácie
    print("Vykonávanie pozadovej úlohy")

    // Návrat na hlavný thread pre aktualizáciu UI
    DispatchQueue.main.async {
        print("Aktualizácia UI na hlavnom vlákne")
    }
}

GCD zjednodušuje prácu s viacerými vláknami a paralelizmus, čím robí kód prehľadnejším a menej náchylným na chyby race conditions v porovnaní s nízkoúrovňovým riadením vlákien (napr., Thread).