Sobes.tech
Middle

Kas yra dispatch grupė iOS kūrimo kontekste?

sobes.tech AI

Atsakymas iš AI

DispatchGroup — tai GCD (Grand Central Dispatch) mechanizmas, leidžiantis stebėti asinchroninių užduočių grupės užbaigimą ir vykdyti veiksmą po jų pabaigos. Naudinga, kai reikia koordinuoti kelių valdiklių eilės ar srautų darbą.

Pagrindiniai metodai:

  • enter(): praneša grupei, kad užduotis pradėta. Padidina grupės vidinį skaitiklį.
  • leave(): praneša grupei, kad užduotis baigta. Sumažina skaitiklį.
  • wait(): blokuoja dabartinį srautą, kol grupės skaitiklis nepasieks nulio arba nepasibaigs laiko limitas.
  • notify(queue:execute:): registruoja kodo bloką, kuris bus vykdomas asinchroniškai nurodytoje eilėje, kai grupės skaitiklis pasieks nulį.

Pavyzdys naudojant notify:

import Foundation

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

queue.async(group: group) {
    // Pirmoji asinchroninė užduotis
    print("Užduotis 1 vyksta...")
    Thread.sleep(forTimeInterval: 1)
    print("Užduotis 1 baigta.")
}

queue.async(group: group) {
    // Antroji asinchroninė užduotis
    print("Užduotis 2 vyksta...")
    Thread.sleep(forTimeInterval: 2)
    print("Užduotis 2 baigta.")
}

// Vykdyti šį bloką po visų užduočių pabaigos
group.notify(queue: .main) {
    print("Visos užduotys grupėje baigtos.")
}

// Demonstracijai — notify ne blokuojantis pobūdis
print("Po užduočių pridėjimo kodas")

Alternatyvus pavyzdys su rankiniu enter() ir leave():

import Foundation

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

group.enter() // Užduotis 1 pradėta
queue.async {
    print("Užduotis 1 vyksta...")
    Thread.sleep(forTimeInterval: 1)
    print("Užduotis 1 baigta.")
    group.leave() // Užduotis 1 baigta
}

group.enter() // Užduotis 2 pradėta
queue.async {
    print("Užduotis 2 vyksta...")
    Thread.sleep(forTimeInterval: 2)
    print("Užduotis 2 baigta.")
    group.leave() // Užduotis 2 baigta
}

group.notify(queue: .main) {
    print("Visos užduotys su notify baigtos.")
}

// Pavyzdys naudojant `wait` (blokuojantis)
// group.wait()
// print("Visos užduotys baigtos su wait.")