Sobes.tech
Middle

Čo je to dispatch skupina v kontexte vývoja iOS?

sobes.tech AI

Odpoveď od AI

DispatchGroup je mechanizmus GCD (Grand Central Dispatch), ktorý umožňuje sledovať dokončenie skupiny asynchrónnych úloh a vykonať akciu po ich dokončení. Je užitočný, keď je potrebné koordinovať prácu viacerých riadiacich front alebo vlákien.

Hlavné metódy:

  • enter(): Oznámi skupine, že úloha začala. Zvýši vnútorný čítač skupiny.
  • leave(): Oznámi skupine, že úloha bola dokončená. Zníži čítač.
  • wait(): Zablokuje aktuálne vlákno, kým sa čítač skupiny nestane nulovým alebo nevyprší časový limit.
  • notify(queue:execute:): Zaregistruje blok kódu, ktorý bude vykonaný asynchrónne na uvedenej fronte, keď sa čítač skupiny stane nulovým.

Príklad použitia notify:

import Foundation

let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .userInitiated)

queue.async(group: group) {
    // Prvá asynchrónna úloha
    print("Úloha 1 sa vykonáva...")
    Thread.sleep(forTimeInterval: 1)
    print("Úloha 1 je dokončená.")
}

queue.async(group: group) {
    // Druhá asynchrónna úloha
    print("Úloha 2 sa vykonáva...")
    Thread.sleep(forTimeInterval: 2)
    print("Úloha 2 je dokončená.")
}

// Vykonať tento blok po dokončení všetkých úloh v skupine
group.notify(queue: .main) {
    print("Všetky úlohy v skupine sú dokončené.")
}

// Pre demonštráciu neblokujúcej povahy notify
print("Kód po pridaní úloh")

Alternatívny príklad s ručným enter() a leave():

import Foundation

let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .userInitiated)

group.enter() // Úloha 1 začala
queue.async {
    print("Úloha 1 sa vykonáva...")
    Thread.sleep(forTimeInterval: 1)
    print("Úloha 1 je dokončená.")
    group.leave() // Úloha 1 je dokončená
}

group.enter() // Úloha 2 začala
queue.async {
    print("Úloha 2 sa vykonáva...")
    Thread.sleep(forTimeInterval: 2)
    print("Úloha 2 je dokončená.")
    group.leave() // Úloha 2 je dokončená
}

group.notify(queue: .main) {
    print("Všetky úlohy v skupine sú dokončené notify.")
}

// Príklad použitia wait (blokujúci)
// group.wait()
// print("Všetky úlohy sú dokončené wait.") // Tento kód sa vykoná po dokončení všetkých úloh, blokujúc aktuálne vlákno.