Sobes.tech
Middle

Mi az a dispatch csoport az iOS fejlesztés kontextusában?

sobes.tech MI

Válasz az MI-től

A DispatchGroup egy GCD (Grand Central Dispatch) mechanizmus, amely lehetővé teszi egy aszinkron feladatcsoport befejezésének nyomon követését, és egy művelet végrehajtását azok befejezése után. Hasznos, amikor több dispatch sor vagy szál munkáját kell koordinálni.

Főbb módszerek:

  • enter(): Jelzi a csoportnak, hogy egy feladat megkezdődött. Növeli a csoport belső számlálóját.
  • leave(): Jelzi a csoportnak, hogy egy feladat befejeződött. Csökkenti a számlálót.
  • wait(): Blokkolja a jelenlegi szálat, amíg a csoport számlálója nem lesz nulla vagy a timeout lejár.
  • notify(queue:execute:): Regisztrál egy kódblokkot, amely aszinkron módon fut le a megadott soron, amikor a csoport számlálója nulla lesz.

Példa a notify használatára:

import Foundation

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

queue.async(group: group) {
    // Első aszinkron feladat
    print("Feladat 1 fut...")
    Thread.sleep(forTimeInterval: 1)
    print("Feladat 1 befejeződött.")
}

queue.async(group: group) {
    // Második aszinkron feladat
    print("Feladat 2 fut...")
    Thread.sleep(forTimeInterval: 2)
    print("Feladat 2 befejeződött.")
}

// Ezt a blokkot futtatja, miután az összes feladat a csoportban befejeződött
group.notify(queue: .main) {
    print("Minden feladat a csoportban befejeződött.")
}

// A notify nem blokkoló természetének demonstrálására
print("Kód a feladatok hozzáadása után")

Kézi enter() és leave() példával:

import Foundation

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

group.enter() // Az első feladat kezdődött
queue.async {
    print("Feladat 1 fut...")
    Thread.sleep(forTimeInterval: 1)
    print("Feladat 1 befejeződött.")
    group.leave() // Az első feladat befejeződött
}

group.enter() // A második feladat kezdődött
queue.async {
    print("Feladat 2 fut...")
    Thread.sleep(forTimeInterval: 2)
    print("Feladat 2 befejeződött.")
    group.leave() // A második feladat befejeződött
}

group.notify(queue: .main) {
    print("Minden feladat a csoportban a notify-val befejeződött.")
}

// A wait használatának példája (blokkoló)
// group.wait()
// print("Minden feladat a wait-tel befejeződött.") // Ez a kód a feladatok befejezése után fog végrehajtódni, blokkolva az aktuális szálat.