Sobes.tech
Junior

Šta je GCD (Grand Central Dispatch) u kontekstu razvoja na iOS?

sobes.tech АИ

Одговор од АИ

GCD (Grand Central Dispatch) je niskonivouni API od Apple za upravljanje paralelnim operacijama i asinhrono izvršavanje koda u aplikacijama. On pruža mehanizam za slanje zadataka u redove izvršavanja, koji ih sistem upravlja.

Ključne osobine:

  • Redovi zadataka (Dispatch Queues): FIFO strukture u koje se dodaju blokovi koda (closures) za izvršenje.
    • Potječu iz tipova concurrent (paralelni) i serial (sekvencijalni).
    • Pružaju globalne sistemske redove i omogućavaju kreiranje korisničkih.
  • Blokovi (Blocks): Jedinice rada koje se šalju u redove.
  • Upravljanje nitima: Apstrahuje od programera direktno upravljanje nitima, omogućavajući sistemu da optimalno rasporedi zadatke na dostupne procesorske jezgre.
  • Prioriteti: Omogućava određivanje prioriteta za zadatke u sistemskim globalnim concurrent redovima.

Tipovi redova:

  • Serial (sekvencijalni): Izvršavaju zadatke strogo jedan po jedan, redom dodavanja. Garantuje da se samo jedan zadatak iz ovog reda izvršava u datom trenutku.
    • Glavni red (DispatchQueue.main) — specijalni serial red za UI osveženja.
    • Korisnički serial redovi.
  • Concurrent (paralelni): Mogu izvršavati više zadataka istovremeno, red završetka nije garantovan.
    • Sistemски globalni concurrent redovi sa različitim nivoima kvaliteta usluge (QoS).
    • Korisnički concurrent redovi.

Nivoi kvaliteta usluge (QoS) za globalne concurrent redove:

Nivo QoS Opis Primeri korišćenja
userInteractive Zadaci sa kojima aktivno interaguje korisnik. Animacije, obrada UI događaja.
userInitiated Zadaci pokrenuti od strane korisnika, koji zahtevaju trenutni rezultat. Učitavanje sadržaja na klik dugmeta.
utility Duže trajuće zadaci koji ne zahtevaju trenutni rezultat. Učitavanje podataka, obrada slika u pozadini.
background Zadaci koji se izvršavaju u pozadini, nevidljivi za korisnika. Ažuriranje keša, sinhronizacija podataka.
unspecified Nivo QoS nije naveden, sistem ga određuje samostalno. Stari API ili niskonivouni sistemski zadaci.

Primer korišćenja:

// Izvršavanje zadatka u pozadinskom thread-u (globalni concurrent red)
DispatchQueue.global(qos: .userInitiated).async {
    // Izvršavanje dugotrajnog operacije
    print("Izvršavanje pozadinskog zadatka")

    // Povratak na glavni thread za ažuriranje UI
    DispatchQueue.main.async {
        print("Ažuriranje UI na glavnom thread-u")
    }
}

GCD pojednostavljuje rad sa višestrukim nitima i paralelizam, čineći kod čitljivijim i manje podložnim greškama poput race conditions u poređenju sa niskonivounim upravljanjem nitima (npr., Thread).