Sobes.tech
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