Jakie metody istnieją do umieszczania zadań w kolejce Grand Central Dispatch (GCD)?
sobes.tech AI
Odpowiedź od AI
Istnieje kilka sposobów umieszczania zadań w kolejce GCD:
-
Wykonanie asynchroniczne (async): Zadanie jest dodawane do kolejki, a wykonanie natychmiast kontynuuje się na bieżącym wątku, nie czekając na zakończenie zadania w kolejce.
DispatchQueue.global().async { // Kod zadania } -
Wykonanie synchroniczne (sync): Zadanie jest dodawane do kolejki, a bieżący wątek jest blokowany do czasu zakończenia zadania. Unikaj używania sync na głównym wątku dla zadań długotrwałych, aby nie blokować UI.
DispatchQueue.global().sync { // Kod zadania, bieżący wątek będzie czekał } -
Wykonanie opóźnione (asyncAfter): Zadanie jest dodawane do kolejki z określonym opóźnieniem. Wykonanie rozpocznie się nie wcześniej niż w podanym czasie.
DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) { // Kod zadania wykona się za 2 sekundy } -
Wykonanie w grupie (DispatchGroup): Zadania mogą być dodane do DispatchGroup w celu synchronizacji ich zakończenia. Można oczekiwać na zakończenie wszystkich lub otrzymać powiadomienie (notify) po ich zakończeniu.
let group = DispatchGroup() group.enter() DispatchQueue.global().async { // Zadanie 1 group.leave() } group.enter() DispatchQueue.global().async { // Zadanie 2 group.leave() } group.notify(queue: .main) { // Wszystkie zadania w grupie zostały zakończone } -
Wykonanie iteracji (concurrentPerform): Pozwala na wykonanie bloku kodu
iterationsrazy równolegle na kolejce współbieżnej.DispatchQueue.concurrentPerform(iterations: 100) { index in // Kod wykonywany dla każdego indeksu równolegle } -
DispatchWorkItem: Opakowuje blok kodu i pozwala na anulowanie zadania przed jego rozpoczęciem lub po dodaniu do kolejki, jeśli jeszcze nie rozpoczęło.
var workItem: DispatchWorkItem? workItem = DispatchWorkItem { // Kod zadania } DispatchQueue.global().async(execute: workItem!) // Zadanie można anulować, jeśli jeszcze nie rozpoczęło // workItem?.cancel()