Sobes.tech
Middle

Jakie narzędzia są dostępne w Grand Central Dispatch (GCD)?

sobes.tech AI

Odpowiedź od AI

Główne narzędzia GCD:

  • Kolejki dispatch (Dispatch Queues): Zarządzają wykonywaniem bloków kodu. Mogą to być:
    • Sekwencyjne (Serial): Wykonują zadania jedno po drugim, gwarantując kolejność.
    • Równoległe (Concurrent): Wykonują zadania jednocześnie (w granicach dostępnych zasobów systemowych).
  • Globalne kolejki równoległe (Global Concurrent Queues): Dostarczane przez system, mają z góry określone priorytety (klasy jakości usług - QoS).
  • Główna kolejka (Main Queue): Specjalna kolejka sekwencyjna powiązana z głównym wątkiem aplikacji. Używana do pracy z UI.
  • Grupy dispatch (Dispatch Groups): Pozwalają śledzić zakończenie zestawu asynchronicznych zadań.
  • Semantyka barier (Barrier Semantics): Dla kolejek równoległych, pozwala utworzyć "barierę", po której wykonywane są tylko zadania umieszczone po barierze, aż do jej pokonania.
  • Źródła dispatch (Dispatch Sources): Pozwalają reagować na zdarzenia systemowe (operacje plików, sygnały, timery itp.).
  • DispatchWorkItem: Opakowuje blok kodu i może być wysłany do kolejki, anulowany i powiadomiony o zakończeniu.

Przykład tworzenia kolejki sekwencyjnej i wykonywania zadania:

let serialQueue = DispatchQueue(label: "com.example.serialQueue")

serialQueue.async {
    // Wykonywane asynchronicznie w kolejce sekwencyjnej
    print("Zadanie wykonane w kolejce sekwencyjnej")
}

Przykład użycia grupy dispatch:

let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

group.enter() // Wchodzimy do grupy
concurrentQueue.async {
    // Zadanie 1
    print("Zadanie 1 zakończone")
    group.leave() // Opuszczamy grupę
}

group.enter() // Wchodzimy do grupy
concurrentQueue.async {
    // Zadanie 2
    print("Zadanie 2 zakończone")
    group.leave() // Opuszczamy grupę
}

group.notify(queue: .main) {
    // Wykonuje się po zakończeniu wszystkich zadań w grupie
    print("Wszystkie zadania w grupie zakończone")
}

Przykład użycia DispatchWorkItem:

let workItem = DispatchWorkItem {
    print("WorkItem wykonany")
}

DispatchQueue.global().async(execute: workItem)

// workItem.cancel() // Można anulować przed wykonaniem