Sobes.tech
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