Middle
Wat is een dispatch-groep in de context van iOS-ontwikkeling?
sobes.tech AI
Antwoord van AI
DispatchGroup — dat mechanisme van GCD (Grand Central Dispatch) dat het mogelijk maakt om de voltooiing van een groep asynchrone taken te volgen en een actie uit te voeren nadat ze zijn voltooid. Handig wanneer je het werk van meerdere dispatch-queues of threads moet coördineren.
Belangrijkste methoden:
enter(): Informeert de groep dat een taak is begonnen. Verhoogt de interne teller van de groep.leave(): Informeert de groep dat een taak is voltooid. Verlaagt de teller.wait(): Blokkeert de huidige thread totdat de teller van de groep nul is of de timeout verloopt.notify(queue:execute:): Registreert een codeblok dat asynchroon wordt uitgevoerd op de opgegeven queue wanneer de teller van de groep nul wordt.
Voorbeeld van het gebruik van notify:
import Foundation
let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .userInitiated)
queue.async(group: group) {
// Eerste asynchrone taak
print("Taak 1 wordt uitgevoerd...")
Thread.sleep(forTimeInterval: 1)
print("Taak 1 voltooid.")
}
queue.async(group: group) {
// Tweede asynchrone taak
print("Taak 2 wordt uitgevoerd...")
Thread.sleep(forTimeInterval: 2)
print("Taak 2 voltooid.")
}
// Voer deze blok uit nadat alle taken in de groep zijn voltooid
group.notify(queue: .main) {
print("Alle taken in de groep zijn voltooid.")
}
// Om de niet-blokkerende aard van notify te demonstreren
print("Code na het toevoegen van taken")
Alternatief voorbeeld met handmatig enter() en leave():
import Foundation
let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .userInitiated)
group.enter() // Taak 1 begonnen
queue.async {
print("Taak 1 wordt uitgevoerd...")
Thread.sleep(forTimeInterval: 1)
print("Taak 1 voltooid.")
group.leave() // Taak 1 voltooid
}
group.enter() // Taak 2 begonnen
queue.async {
print("Taak 2 wordt uitgevoerd...")
Thread.sleep(forTimeInterval: 2)
print("Taak 2 voltooid.")
group.leave() // Taak 2 voltooid
}
group.notify(queue: .main) {
print("Alle taken in de groep zijn voltooid met notify.")
}
// Voorbeeld van gebruik van wait (blokkerend)
// group.wait()
// print("Alle taken voltooid met wait.") // Deze code wordt uitgevoerd nadat alle taken zijn voltooid, en blokkeert de huidige thread.