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