Sobes.tech
Middle

Kas ir dispatch grupa iOS izstrādes kontekstā?

sobes.tech AI

Atbilde no AI

DispatchGroup ir mekanisms GCD (Grand Central Dispatch), kas ļauj uzraudzīt asenhronisko uzdevumu grupas pabeigšanu un veikt darbību pēc to pabeigšanas. Noder, kad nepieciešams koordinēt vairākus vadības rindu vai plūsmu darbu.

Galvenās metodes:

  • enter(): paziņo grupai, ka uzdevums ir uzsākts. Palielina grupas iekšējo skaitītāju.
  • leave(): paziņo grupai, ka uzdevums ir pabeigts. Samazina skaitītāju.
  • wait(): bloķē pašreizējo plūsmu līdz grupas skaitītājs kļūst par nulli vai beidzas laika limits.
  • notify(queue:execute:): reģistrē koda bloku, kas tiks izpildīts asinhroni norādītajā rindā, kad grupas skaitītājs kļūs par nulli.

Piemērs ar notify:

import Foundation

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

queue.async(group: group) {
    // Pirmā asinhronā uzdevuma izpilde
    print("Uzdevums 1 tiek izpildīts...")
    Thread.sleep(forTimeInterval: 1)
    print("Uzdevums 1 pabeigts.")
}

queue.async(group: group) {
    // Otrā asinhronā uzdevuma izpilde
    print("Uzdevums 2 tiek izpildīts...")
    Thread.sleep(forTimeInterval: 2)
    print("Uzdevums 2 pabeigts.")
}

// Izpildīt šo bloku pēc visu uzdevumu pabeigšanas
group.notify(queue: .main) {
    print("Visi uzdevumi grupā ir pabeigti.")
}

// Demonstrācijai — notify ne bloķējošā daba
print("Kods pēc uzdevumu pievienošanas")

Alternatīvs piemērs ar manuālo enter() un leave():

import Foundation

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

group.enter() // Uzdevums 1 sākās
queue.async {
    print("Uzdevums 1 tiek izpildīts...")
    Thread.sleep(forTimeInterval: 1)
    print("Uzdevums 1 pabeigts.")
    group.leave() // Uzdevums 1 pabeigts
}

group.enter() // Uzdevums 2 sākās
queue.async {
    print("Uzdevums 2 tiek izpildīts...")
    Thread.sleep(forTimeInterval: 2)
    print("Uzdevums 2 pabeigts.")
    group.leave() // Uzdevums 2 pabeigts
}

group.notify(queue: .main) {
    print("Visi uzdevumi ar notify ir pabeigti.")
}

// Piemērs ar `wait` (bloķējošs)
// group.wait()
// print("Visi uzdevumi pabeigti ar wait.")