Middle
Kas yra Grand Central Dispatch ir kaip jis naudojamas iOS kūrime?
sobes.tech AI
Atsakymas iš AI
Grand Central Dispatch (GCD) — žemo lygio API, skirtas daugiabriaunių procesų valdymui, kuris teikia sisteminių gijų pulą ir planuoja užduočių vykdymą jomis.
GCD pagrindinės sąvokos:
- Dispatch Queue: eilės, į kurias dedami kodo blokai (užduotys) vykdymui.
- Seryvinės eilės: vykdo blokus pagal pridėjimo tvarką, po vieną.
- Paralelios eilės: vykdo blokus lygiagrečiai, bet pagal pridėjimo tvarką.
- Užduotys (Blokai): darbo vienetai, kurie siunčiami į Dispatch eilutes.
- Dispatch Sources: stebės sistemos įvykius (failus, lizdus, signalus), kurie iškviečia blokų vykdymą jų atsiradimo metu.
Naudojimas:
-
Fono operacijų vykdymas: duomenų įkėlimas iš tinklo, vaizdų apdorojimas, sudėtingi skaičiavimai, kad pagrindinė gija (UI) nebūtų užblokuota.
DispatchQueue.global(qos: .userInitiated).async { // Resursų intensyvi operacija let processedData = performHeavyProcessing() DispatchQueue.main.async { // UI atnaujinimas pagrindinėje gijoje updateUI(with: processedData) } } -
Užduočių planavimas: atidėtas vykdymas arba periodinis vykdymas.
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { // Šis kodas bus vykdomas po 2 sekundžių print("Atidėtas vykdymas") } -
Prieigos prie duomenų sinchronizavimas: naudojant serijines eilutes arba
DispatchQueue.concurrentPerformkontrolę.let syncQueue = DispatchQueue(label: "com.myapp.syncdatasource", attributes: .concurrent) var sharedArray = [Int]() func addItem(_ item: Int) { syncQueue.async(flags: .barrier) { // Naudojant .barrier, siekiant išskirtinio prieigos sharedArray.append(item) } } func processItems() { syncQueue.sync { // Sinchroninis skaitymas for item in sharedArray { print(item) } } }
Pranašumai prieš rankinį sriegių valdymą (POSIX threads):
- Lengviau naudoti: aukštesnio lygio abstrakcija.
- Efektyvumas: GCD efektyviau valdo sisteminių sriegių pulą, mažina išlaidas.
- Mastelio keitimas: automatiškai prisitaiko prie procesoriaus branduolių skaičiaus.
QoS tipai (Paslaugos kokybė): nustato užduoties prioritetą GCD planuotojui.
| QoS | Pritaikymas |
|---|---|
| userInteractive | UI atnaujinimai, animacijos, greita reakcija |
| userInitiated | Vartotojo inicijuotos užduotys, reikalaujančios greito užbaigimo (įkėlimas, nuotraukų apdorojimas) |
| default | Numatytoji prioritetas, tarp userInitiated ir utility |
| utility | Ilgalaikės užduotys be skubos (įkėlimas, indeksavimas) |
| background | Fono užduotys, nematomos vartotojui (atsarginė kopija, sinchronizacija fone) |
| unspecified | Prioritetas nenustatytas, nustato sistema |