Sobes.tech
Middle

Welche Methoden gibt es, um Aufgaben in die Warteschlange von Grand Central Dispatch (GCD) zu stellen?

sobes.tech KI

Antwort von AI

Es gibt die folgenden Möglichkeiten, Aufgaben in die GCD-Warteschlange einzureihen:

  1. Asynchrone Ausführung (async): Die Aufgabe wird in die Warteschlange eingefügt, und die Ausführung wird sofort im aktuellen Thread fortgesetzt, ohne auf den Abschluss der Aufgabe in der Warteschlange zu warten.

    DispatchQueue.global().async {
        // Code der Aufgabe
    }
    
  2. Synchrone Ausführung (sync): Die Aufgabe wird in die Warteschlange eingefügt, und der aktuelle Thread wird blockiert, bis die Aufgabe in der Warteschlange beendet ist. Vermeiden Sie die Verwendung von sync im Haupt-Thread für lang andauernde Aufgaben, um die UI nicht zu blockieren.

    DispatchQueue.global().sync {
        // Code der Aufgabe, der aktuelle Thread wartet
    }
    
  3. Verzögerte Ausführung (asyncAfter): Die Aufgabe wird mit einer angegebenen Verzögerung in die Warteschlange eingefügt. Die Ausführung beginnt nicht vor der angegebenen Zeit.

    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        // Der Code der Aufgabe wird in 2 Sekunden ausgeführt
    }
    
  4. Ausführung in einer Gruppe (DispatchGroup): Aufgaben können zu einer DispatchGroup hinzugefügt werden, um deren Abschluss zu synchronisieren. Man kann auf deren Abschluss warten oder benachrichtigt werden (notify).

    let group = DispatchGroup()
    
    group.enter()
    DispatchQueue.global().async {
        // Aufgabe 1
        group.leave()
    }
    
    group.enter()
    DispatchQueue.global().async {
        // Aufgabe 2
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Alle Aufgaben in der Gruppe sind abgeschlossen
    }
    
  5. Ausführung von Iterationen (concurrentPerform): Ermöglicht die parallele Ausführung eines Codeblocks iterations-Mal auf einer gleichzeitigen Warteschlange.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Code, der für jeden Index parallel ausgeführt wird
    }
    
  6. DispatchWorkItem: Wrappt einen Codeblock und ermöglicht das Abbrechen der Aufgabe vor oder nach dem Hinzufügen zur Warteschlange, wenn sie noch nicht gestartet wurde.

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Code der Aufgabe
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // Die Aufgabe kann abgebrochen werden, wenn sie noch nicht begonnen hat
    // workItem?.cancel()