Sobes.tech
Junior

Kas yra GCD (Grand Central Dispatch) iOS kūrimo kontekste?

sobes.tech AI

Atsakymas iš AI

GCD (Grand Central Dispatch) yra žemo lygio API iš Apple, skirtas valdyti paralelines operacijas ir asinchroniškai vykdyti kodą programose. Jis suteikia mechanizmą siųsti užduotis vykdymo eilėms, kurias valdo sistema.

Pagrindinės savybės:

  • Užduočių eilės (Dispatch Queues): FIFO struktūros, į kurias pridedami kodo blokai (closures) vykdymui.
    • Kyla iš tipų concurrent (paralelinių) ir serial (eilinių).
    • Siūlo globalias sistemines eilutes ir leidžia kurti savo.
  • Blokai (Blocks): Darbo vienetai, siunčiami į eilutes.
  • Vielų valdymas: Paslepia nuo kūrėjo tiesioginį vielų valdymą, leidžia sistemai optimaliai paskirstyti užduotis prieinamoms procesoriaus šerdims.
  • Prioritetai: Leidžia nurodyti prioritetą užduotims sisteminėse globaliose concurrent eilėse.

Eilių tipai:

  • Serial (eilinės): Vykdo užduotis griežtai po vieną, pagal jų pridėjimo tvarką. Užtikrina, kad tik viena užduotis iš šios eilės vykdoma bet kuriuo metu.
    • Pagrindinė eilė (DispatchQueue.main) — speciali serialinė eilė UI atnaujinimams.
    • Naudotojo sukurtos serialinės eilės.
  • Concurrent (paralelinės): Gali vykdyti kelias užduotis vienu metu, užbaigimo tvarka nėra garantuota.
    • Sistemos globalios concurrent eilės su skirtingais kokybės lygiais (QoS).
    • Naudotojo sukurtos concurrent eilės.

QoS lygiai globalioms concurrent eilėms:

QoS lygis Aprašymas Pavyzdžiai naudojimo
userInteractive Užduotys, su kuriomis aktyviai sąveikauja naudotojas. Animacijos, UI įvykių apdorojimas.
userInitiated Užduotys, pradėtos naudotojo, kurioms reikalingas nedelstas rezultatas. Turinio įkėlimas paspaudus mygtuką.
utility Ilgai trunkančios užduotys, kurios nereikalauja nedelto rezultato. Duomenų įkėlimas, vaizdų apdorojimas fone.
background Užduotys, vykdomos fone, nematomos naudotojui. Kaso atnaujinimas, duomenų sinchronizavimas.
unspecified QoS lygis nenustatytas, sistema jį nustato savarankiškai. Senas API ar žemo lygio sisteminės užduotys.

Pavyzdys:

// Vykdyti užduotį fono sraute (globali concurrent eilė)
DispatchQueue.global(qos: .userInitiated).async {
    // Vykdyti ilgai trunkančią operaciją
    print("Fono užduoties vykdymas")

    // Grįžti į pagrindinį srautą UI atnaujinimui
    DispatchQueue.main.async {
        print("UI atnaujinimas pagrindiniame sraute")
    }
}

GCD supaprastina daugiaveiksmio ir paralelinio darbo valdymą, daro kodą aiškesnį ir mažiau linkusį į race conditions klaidas, palyginti su žemo lygio vielų valdymu (pvz., Thread).