Sobes.tech
Middle

Co je to dispatch skupina v kontextu vývoje iOS?

sobes.tech AI

Odpověď od AI

DispatchGroup — je mechanismus GCD (Grand Central Dispatch), který umožňuje sledovat dokončení skupiny asynchronních úloh a provést akci po jejich dokončení. Je užitečný, když je třeba koordinovat práci několika dispatchových front nebo vláken.

Hlavní metody:

  • enter(): Informuje skupinu, že úloha začala. Zvyšuje interní čítač skupiny.
  • leave(): Informuje skupinu, že úloha skončila. Snižuje čítač.
  • wait(): Zablokuje aktuální vlákno, dokud čítač skupiny nedosáhne nuly nebo nevyprší časový limit.
  • notify(queue:execute:): Zaregistruje blok kódu, který bude asynchronně proveden na specifikované frontě, když čítač skupiny dosáhne nuly.

Příklad použití notify:

import Foundation

let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .userInitiated)

queue.async(group: group) {
    // První asynchronní úloha
    print("Úloha 1 běží...")
    Thread.sleep(forTimeInterval: 1)
    print("Úloha 1 dokončena.")
}

queue.async(group: group) {
    // Druhá asynchronní úloha
    print("Úloha 2 běží...")
    Thread.sleep(forTimeInterval: 2)
    print("Úloha 2 dokončena.")
}

// Tento blok se spustí po dokončení všech úloh v skupině
group.notify(queue: .main) {
    print("Všechny úlohy ve skupině jsou dokončeny.")
}

// Pro demonstraci nespouštějící povahy notify
print("Kód po přidání úloh")

Alternativní příklad s ručním enter() a leave():

import Foundation

let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .userInitiated)

group.enter() // Úloha 1 začala
queue.async {
    print("Úloha 1 běží...")
    Thread.sleep(forTimeInterval: 1)
    print("Úloha 1 dokončena.")
    group.leave() // Úloha 1 dokončena
}

group.enter() // Úloha 2 začala
queue.async {
    print("Úloha 2 běží...")
    Thread.sleep(forTimeInterval: 2)
    print("Úloha 2 dokončena.")
    group.leave() // Úloha 2 dokončena
}

group.notify(queue: .main) {
    print("Všechny úlohy ve skupině jsou dokončeny s notify.")
}

// Příklad použití wait (blokující)
// group.wait()
// print("Všechny úlohy dokončeny s wait.") // Tento kód se provede po dokončení všech úloh, blokujíc aktuální vlákno.