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.
- Pagrindinė eilė (
- 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).