Middle
Welke tools zijn beschikbaar in Grand Central Dispatch (GCD)?
sobes.tech AI
Antwoord van AI
Belangrijkste tools van GCD:
- Dispatch-queues: Beheren de uitvoering van codeblokken. Ze kunnen zijn:
- Serieel (Serial): Voeren taken één voor één uit, garanderen de volgorde.
- Gelijktijdig (Concurrent): Voeren taken gelijktijdig uit (binnen de beschikbare systeembronnen).
- Globale gelijktijdige queues (Global Concurrent Queues): Worden door het systeem geleverd, met vooraf gedefinieerde prioriteiten (kwaliteitsklassen van service - QoS).
- Hoofdqueue (Main Queue): Een speciale serieel queue die verbonden is met de hoofdthread van de applicatie. Gebruikt voor UI-bewerkingen.
- Dispatch-groepen (Dispatch Groups): Maken het mogelijk om de voltooiing van een set asynchrone taken te volgen.
- Barrière-semantic (Barrier Semantics): Voor gelijktijdige queues, maakt het mogelijk om een "barrière" te creëren, waarna alleen taken die na de barrière worden geplaatst, worden uitgevoerd, totdat deze is overwonnen.
- Dispatch-bronnen (Dispatch Sources): Maken het mogelijk om te reageren op systeemgebeurtenissen (bestandsbewerkingen, signalen, timers, etc.).
- DispatchWorkItem: Omhult een codeblok en kan worden verzonden naar een queue, geannuleerd en bij voltooiing worden gemeld.
Voorbeeld van het maken van een serieel queue en het uitvoeren van een taak:
let serialQueue = DispatchQueue(label: "com.example.serialQueue")
serialQueue.async {
// Wordt asynchroon uitgevoerd in de serieel queue
print("Taak uitgevoerd in de serieel queue")
}
Voorbeeld van het gebruik van een dispatch-groep:
let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
group.enter() // Betreed de groep
concurrentQueue.async {
// Taak 1
print("Taak 1 voltooid")
group.leave() // Verlaat de groep
}
group.enter() // Betreed de groep
concurrentQueue.async {
// Taak 2
print("Taak 2 voltooid")
group.leave() // Verlaat de groep
}
group.notify(queue: .main) {
// Wordt uitgevoerd na voltooiing van alle taken in de groep
print("Alle taken in de groep zijn voltooid")
}
Voorbeeld van het gebruik van DispatchWorkItem:
let workItem = DispatchWorkItem {
print("WorkItem uitgevoerd")
}
DispatchQueue.global().async(execute: workItem)
// workItem.cancel() // Kan worden geannuleerd voordat het wordt uitgevoerd