Middle
Welche Werkzeuge sind im Grand Central Dispatch (GCD) verfügbar?
sobes.tech KI
Antwort von AI
Hauptwerkzeuge von GCD:
- Dispatch-Warteschlangen (Dispatch Queues): Steuern die Ausführung von Codeblöcken. Es gibt:
- Serielle (Serial): Führen Aufgaben nacheinander aus, um die Reihenfolge zu garantieren.
- Parallele (Concurrent): Führen Aufgaben gleichzeitig aus (innerhalb der verfügbaren Systemressourcen).
- Globale parallele Warteschlangen (Global Concurrent Queues): Vom System bereitgestellt, mit vordefinierten Prioritäten (Service-Qualitätsklassen - QoS).
- Hauptwarteschlange (Main Queue): Eine spezielle serielle Warteschlange, die mit dem Hauptthread der Anwendung verbunden ist. Wird für UI-Arbeiten verwendet.
- Dispatch-Gruppen (Dispatch Groups): Ermöglichen die Überwachung des Abschlusses einer Gruppe asynchroner Aufgaben.
- Barriere-Semantik (Barrier Semantics): Für parallele Warteschlangen, ermöglicht das Erstellen einer "Barriere", nach der nur Aufgaben ausgeführt werden, die nach der Barriere platziert wurden, bis diese überwunden ist.
- Dispatch-Quellen (Dispatch Sources): Ermöglichen die Reaktion auf Systemereignisse (Dateioperationen, Signale, Timer usw.).
- DispatchWorkItem: Wrappt einen Codeblock und kann in die Warteschlange gesendet, abgebrochen und bei Abschluss benachrichtigt werden.
Beispiel für die Erstellung einer seriellen Warteschlange und die Ausführung einer Aufgabe:
let serialQueue = DispatchQueue(label: "com.example.serialQueue")
serialQueue.async {
// Wird asynchron in der seriellen Warteschlange ausgeführt
print("Aufgabe in der seriellen Warteschlange ausgeführt")
}
Beispiel für die Verwendung einer Dispatch-Gruppe:
let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
group.enter() // Gruppe betreten
concurrentQueue.async {
// Aufgabe 1
print("Aufgabe 1 abgeschlossen")
group.leave() // Gruppe verlassen
}
group.enter() // Gruppe betreten
concurrentQueue.async {
// Aufgabe 2
print("Aufgabe 2 abgeschlossen")
group.leave() // Gruppe verlassen
}
group.notify(queue: .main) {
// Wird nach Abschluss aller Aufgaben in der Gruppe ausgeführt
print("Alle Aufgaben in der Gruppe sind abgeschlossen")
}
Beispiel für die Verwendung von DispatchWorkItem:
let workItem = DispatchWorkItem {
print("WorkItem ausgeführt")
}
DispatchQueue.global().async(execute: workItem)
// workItem.cancel() // Kann vor der Ausführung abgebrochen werden