Middle
Czym jest grupa dispatch w kontekście rozwoju iOS?
sobes.tech AI
Odpowiedź od AI
DispatchGroup — to mechanizm GCD (Grand Central Dispatch), który pozwala śledzić zakończenie grupy zadań asynchronicznych i wykonać akcję po ich zakończeniu. Przydatny, gdy konieczne jest skoordynowanie pracy kilku kolejek dispatch lub wątków.
Główne metody:
enter(): Informuje grupę, że zadanie się rozpoczęło. Zwiększa wewnętrzny licznik grupy.leave(): Informuje grupę, że zadanie się zakończyło. Zmniejsza licznik.wait(): Blokuje bieżący wątek do czasu, aż licznik grupy nie osiągnie zera lub nie upłynie czas oczekiwania.notify(queue:execute:): Rejestruje blok kodu, który zostanie wykonany asynchronicznie na wskazanej kolejce, gdy licznik grupy osiągnie zero.
Przykład użycia notify:
import Foundation
let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .userInitiated)
queue.async(group: group) {
// Pierwsze zadanie asynchroniczne
print("Zadanie 1 w trakcie...")
Thread.sleep(forTimeInterval: 1)
print("Zadanie 1 zakończone.")
}
queue.async(group: group) {
// Drugie zadanie asynchroniczne
print("Zadanie 2 w trakcie...")
Thread.sleep(forTimeInterval: 2)
print("Zadanie 2 zakończone.")
}
// Wykonać ten blok po zakończeniu wszystkich zadań w grupie
group.notify(queue: .main) {
print("Wszystkie zadania w grupie zakończone.")
}
// Aby pokazać nieblokującą naturę notify
print("Kod po dodaniu zadań")
Przykład alternatywny z ręcznym enter() i leave():
import Foundation
let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .userInitiated)
group.enter() // Zadanie 1 rozpoczęte
queue.async {
print("Zadanie 1 w trakcie...")
Thread.sleep(forTimeInterval: 1)
print("Zadanie 1 zakończone.")
group.leave() // Zadanie 1 zakończone
}
group.enter() // Zadanie 2 rozpoczęte
queue.async {
print("Zadanie 2 w trakcie...")
Thread.sleep(forTimeInterval: 2)
print("Zadanie 2 zakończone.")
group.leave() // Zadanie 2 zakończone
}
group.notify(queue: .main) {
print("Wszystkie zadania w grupie zakończone z notify.")
}
// Przykład użycia wait (blokujący)
// group.wait()
// print("Wszystkie zadania zakończone z wait.") // Ten kod zostanie wykonany po zakończeniu wszystkich zadań, blokując bieżący wątek.