Sobes.tech
Middle

Welke methoden bestaan er om taken in de wachtrij van Grand Central Dispatch (GCD) te plaatsen?

sobes.tech AI

Antwoord van AI

Er zijn de volgende manieren om taken in de GCD-wachtrij te plaatsen:

  1. Asynchrone uitvoering (async): De taak wordt aan de wachtrij toegevoegd en de uitvoering wordt onmiddellijk voortgezet op de huidige thread, zonder te wachten tot de taak in de wachtrij is voltooid.

    DispatchQueue.global().async {
        // Taakcode
    }
    
  2. Synchrone uitvoering (sync): De taak wordt aan de wachtrij toegevoegd en de huidige thread wordt geblokkeerd totdat de taak in de wachtrij is voltooid. Vermijd het gebruik van sync op de hoofdthread voor langdurige taken om de UI niet te blokkeren.

    DispatchQueue.global().sync {
        // Taakcode, de huidige thread wacht
    }
    
  3. Uitgesteld uitvoeren (asyncAfter): De taak wordt met een opgegeven vertraging aan de wachtrij toegevoegd. De uitvoering begint niet eerder dan de aangegeven tijd.

    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        // Taakcode wordt over 2 seconden uitgevoerd
    }
    
  4. Uitvoeren in groep (DispatchGroup): Taken kunnen worden toegevoegd aan een DispatchGroup om hun voltooiing te synchroniseren. Je kunt wachten tot alle taken klaar zijn of een melding krijgen (notify) nadat ze klaar zijn.

    let group = DispatchGroup()
    
    group.enter()
    DispatchQueue.global().async {
        // Taak 1
        group.leave()
    }
    
    group.enter()
    DispatchQueue.global().async {
        // Taak 2
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Alle taken in de groep zijn voltooid
    }
    
  5. Iteraties uitvoeren (concurrentPerform): Hiermee kun je een blok code iterations keer parallel uitvoeren op een gelijktijdige wachtrij.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Code die voor elke index parallel wordt uitgevoerd
    }
    
  6. DispatchWorkItem: Omvat een blok code en maakt het mogelijk om de taak te annuleren voordat deze start of nadat deze aan de wachtrij is toegevoegd, als deze nog niet is begonnen.

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Taakcode
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // De taak kan worden geannuleerd als deze nog niet is begonnen
    // workItem?.cancel()