Middle
Aké nástroje sú k dispozícii v Grand Central Dispatch (GCD)?
sobes.tech AI
Odpoveď od AI
Hlavné nástroje GCD:
- Dispečerské fronty (Dispatch Queues): Riadi vykonávanie blokov kódu. Môžu byť:
- Sekvenčné (Serial): vykonávajú úlohy po jednej, zabezpečujúc poradie.
- Parallé (Concurrent): vykonávajú úlohy súčasne (v rámci dostupných systémových zdrojov).
- Globálne paralelné fronty (Global Concurrent Queues): Poskytované systémom, majú preddefinované priority (kvalitatívne triedy služby - QoS).
- Hlavná fronta (Main Queue): Špeciálna sekvenčná fronta spojená s hlavným vláknom aplikácie. Používa sa na prácu s UI.
- Dispečerské skupiny (Dispatch Groups): Umožňujú sledovať ukončenie sady asynchrónnych úloh.
- Barrier Semantics: Pre paralelné fronty, umožňuje vytvoriť "barrier", po ktorom sa vykonajú iba úlohy, ktoré sú za barrierom, kým barrier nebude prekonaný.
- Dispečerské zdroje (Dispatch Sources): Umožňujú reagovať na systémové udalosti (súborové operácie, signály, časovače atď.).
- DispatchWorkItem: Obaluje blok kódu a môže byť odoslaný do fronty, zrušený a upozornený na ukončenie.
Príklad vytvorenia sekvenčnej fronty a vykonania úlohy:
let serialQueue = DispatchQueue(label: "com.example.serialQueue")
serialQueue.async {
// Vykonáva sa asynchrónne v sekvenčnej fronte
print("Úloha vykonaná v sekvenčnej fronte")
}
Príklad použitia dispečerskej skupiny:
let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
group.enter() // Vstup do skupiny
concurrentQueue.async {
// Úloha 1
print("Úloha 1 ukončená")
group.leave() // Odchod zo skupiny
}
group.enter() // Vstup do skupiny
concurrentQueue.async {
// Úloha 2
print("Úloha 2 ukončená")
group.leave() // Odchod zo skupiny
}
group.notify(queue: .main) {
// Vykoná sa po ukončení všetkých úloh v skupine
print("Všetky úlohy v skupine ukončené")
}
Príklad použitia DispatchWorkItem:
let workItem = DispatchWorkItem {
print("WorkItem vykonané")
}
DispatchQueue.global().async(execute: workItem)
// workItem.cancel() // Môže byť zrušené pred vykonaním