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.