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:
-
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 } -
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 } -
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 } -
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 } -
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 } -
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()