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.")