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