Sobes.tech
Middle

Jaké nástroje jsou k dispozici v Grand Central Dispatch (GCD)?

sobes.tech AI

Odpověď od AI

Hlavní nástroje GCD:

  • Dispatchové fronty (Dispatch Queues): Řídí vykonávání bloků kódu. Mohou být:
    • Sekvenční (Serial): Vykonávají úkoly jeden po druhém, zajišťují pořadí.
    • Paralelní (Concurrent): Vykonávají úkoly současně (v rámci dostupných systémových zdrojů).
  • Globální paralelní fronty (Global Concurrent Queues): Poskytovány systémem, mají předdefinované priority (třídy kvality služby - QoS).
  • Hlavní fronta (Main Queue): Speciální sekvenční fronta spojená s hlavním vláknem aplikace. Používá se pro práci s UI.
  • Dispatch skupiny (Dispatch Groups): Umožňují sledovat dokončení sady asynchronních úkolů.
  • Barrier semantika (Barrier Semantics): Pro paralelní fronty, umožňuje vytvořit "bariéru", po které jsou vykonávány pouze úkoly za bariérou, dokud není překonána.
  • Dispatch zdroje (Dispatch Sources): Umožňují reagovat na systémové události (operace souborů, signály, časovače atd.).
  • DispatchWorkItem: Obaluje blok kódu a může být odeslán do fronty, zrušen a upozorněn na dokončení.

Příklad vytvoření sekvenční fronty a vykonání úkolu:

let serialQueue = DispatchQueue(label: "com.example.serialQueue")

serialQueue.async {
    // Asynchronně vykonávané v sekvenční frontě
    print("Úkol vykonán v sekvenční frontě")
}

Příklad použití dispatch skupiny:

let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

group.enter() // Vstup do skupiny
concurrentQueue.async {
    // Úkol 1
    print("Úkol 1 dokončen")
    group.leave() // Opustit skupinu
}

group.enter() // Vstup do skupiny
concurrentQueue.async {
    // Úkol 2
    print("Úkol 2 dokončen")
    group.leave() // Opustit skupinu
}

group.notify(queue: .main) {
    // Bude spuštěno po dokončení všech úkolů ve skupině
    print("Všechny úkoly ve skupině dokončeny")
}

Příklad použití DispatchWorkItem:

let workItem = DispatchWorkItem {
    print("WorkItem vykonán")
}

DispatchQueue.global().async(execute: workItem)

// workItem.cancel() // Může být zrušen před vykonáním