Sobes.tech
Junior

Co je GCD (Grand Central Dispatch) v kontextu vývoje na iOS?

sobes.tech AI

Odpověď od AI

GCD (Grand Central Dispatch) je nízkoúrovňové API od Apple pro správu paralelních operací a asynchronní vykonávání kódu v aplikacích. Poskytuje mechanismus pro odesílání úloh do front vykonávání, které jsou systémem řízeny.

Klíčové vlastnosti:

  • Fronty úloh (Dispatch Queues): FIFO struktury, do kterých jsou přidávány bloky kódu (closures) k vykonání.
    • Vycházejí z typů concurrent (paralelní) a serial (sekvenční).
    • Nabízejí globální systémové fronty a umožňují vytváření vlastních.
  • Bloky (Blocks): Jednotky práce, které jsou odesílány do front.
  • Správa vláken: Abstrahuje vývojáře od přímé správy vláken, umožňuje systému optimálně rozdělovat úlohy na dostupné procesorové jádra.
  • Prioritní úrovně: Umožňuje uvádět prioritu pro úlohy ve systémových globálních concurrent frontách.

Typy front:

  • Serial (sekvenční): Vykonávají úlohy přesně po jedné, v pořadí jejich přidání. Zaručují, že pouze jedna úloha z této fronty je vykonávána v daném okamžiku.
    • Hlavní fronta (DispatchQueue.main) — speciální serial fronta pro UI aktualizace.
    • Vlastní serial fronty.
  • Concurrent (paralelní): Mohou vykonávat více úloh současně, pořadí dokončení není garantováno.
    • Systémové globální concurrent fronty s různými úrovněmi kvality služby (QoS).
    • Vlastní concurrent fronty.

QoS úrovně pro globální concurrent fronty:

Úroveň QoS Popis Příklady použití
userInteractive Úlohy, se kterými aktivně komunikuje uživatel. Animace, zpracování UI událostí.
userInitiated Úlohy spuštěné uživatelem, které vyžadují okamžitý výsledek. Načítání obsahu po stisknutí tlačítka.
utility Dlouhotrvající úlohy, které nevyžadují okamžitý výsledek. Načítání dat, zpracování obrázků na pozadí.
background Úlohy probíhající na pozadí, neviditelné pro uživatele. Aktualizace cache, synchronizace dat.
unspecified Úroveň QoS není uvedena, systém ji určuje sám. Starší API nebo nízkoúrovňové systémové úlohy.

Příklad použití:

// Spuštění úlohy na pozadí (globální concurrent fronta)
DispatchQueue.global(qos: .userInitiated).async {
    // Provedení dlouhotrvající operace
    print("Provádění úlohy na pozadí")

    // Návrat na hlavní vlákno pro aktualizaci UI
    DispatchQueue.main.async {
        print("Aktualizace UI na hlavním vlákně")
    }
}

GCD zjednodušuje práci s vícero vlákny a paralelním zpracováním, čímž činí kód přehlednější a méně náchylný k chybám race conditions ve srovnání s nízkoúrovňovou správou vláken (například Thread).