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