Middle
Čo je to dispatch skupina v kontexte vývoja iOS?
sobes.tech AI
Odpoveď od AI
DispatchGroup je mechanizmus GCD (Grand Central Dispatch), ktorý umožňuje sledovať dokončenie skupiny asynchrónnych úloh a vykonať akciu po ich dokončení. Je užitočný, keď je potrebné koordinovať prácu viacerých riadiacich front alebo vlákien.
Hlavné metódy:
enter(): Oznámi skupine, že úloha začala. Zvýši vnútorný čítač skupiny.leave(): Oznámi skupine, že úloha bola dokončená. Zníži čítač.wait(): Zablokuje aktuálne vlákno, kým sa čítač skupiny nestane nulovým alebo nevyprší časový limit.notify(queue:execute:): Zaregistruje blok kódu, ktorý bude vykonaný asynchrónne na uvedenej fronte, keď sa čítač skupiny stane nulovým.
Príklad použitia notify:
import Foundation
let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .userInitiated)
queue.async(group: group) {
// Prvá asynchrónna úloha
print("Úloha 1 sa vykonáva...")
Thread.sleep(forTimeInterval: 1)
print("Úloha 1 je dokončená.")
}
queue.async(group: group) {
// Druhá asynchrónna úloha
print("Úloha 2 sa vykonáva...")
Thread.sleep(forTimeInterval: 2)
print("Úloha 2 je dokončená.")
}
// Vykonať tento blok po dokončení všetkých úloh v skupine
group.notify(queue: .main) {
print("Všetky úlohy v skupine sú dokončené.")
}
// Pre demonštráciu neblokujúcej povahy notify
print("Kód po pridaní úloh")
Alternatívny prí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 sa vykonáva...")
Thread.sleep(forTimeInterval: 1)
print("Úloha 1 je dokončená.")
group.leave() // Úloha 1 je dokončená
}
group.enter() // Úloha 2 začala
queue.async {
print("Úloha 2 sa vykonáva...")
Thread.sleep(forTimeInterval: 2)
print("Úloha 2 je dokončená.")
group.leave() // Úloha 2 je dokončená
}
group.notify(queue: .main) {
print("Všetky úlohy v skupine sú dokončené notify.")
}
// Príklad použitia wait (blokujúci)
// group.wait()
// print("Všetky úlohy sú dokončené wait.") // Tento kód sa vykoná po dokončení všetkých úloh, blokujúc aktuálne vlákno.