Sobes.tech
Middle

Ce este un grup de dispatch în contextul dezvoltării iOS?

sobes.tech AI

Răspuns de la AI

DispatchGroup — este un mecanism al GCD (Grand Central Dispatch) care permite urmărirea finalizării unui grup de sarcini asincrone și executarea unei acțiuni după finalizarea acestora. Este util atunci când este necesar să coordonezi lucrul mai multor cozi de dispatch sau fire de execuție.

Metode principale:

  • enter(): Informează grupul că o sarcină a început. Crește contorul intern al grupului.
  • leave(): Informează grupul că o sarcină s-a încheiat. Scade contorul.
  • wait(): Blochează firul de execuție curent până când contorul grupului devine zero sau expiră timeout-ul.
  • notify(queue:execute:): Înregistrează un bloc de cod care va fi executat asincron pe coada specificată atunci când contorul grupului devine zero.

Exemplu de utilizare a notify:

import Foundation

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

queue.async(group: group) {
    // Prima sarcină asincronă
    print("Sarcina 1 se execută...")
    Thread.sleep(forTimeInterval: 1)
    print("Sarcina 1 finalizată.")
}

queue.async(group: group) {
    // A doua sarcină asincronă
    print("Sarcina 2 se execută...")
    Thread.sleep(forTimeInterval: 2)
    print("Sarcina 2 finalizată.")
}

// Execută acest bloc după ce toate sarcinile din grup s-au finalizat
group.notify(queue: .main) {
    print("Toate sarcinile din grup s-au finalizat.")
}

// Pentru a demonstra natura non-blocantă a notify
print("Cod după adăugarea sarcinilor")

Exemplu alternativ cu enter() și leave() manual:

import Foundation

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

group.enter() // Sarcina 1 a început
queue.async {
    print("Sarcina 1 se execută...")
    Thread.sleep(forTimeInterval: 1)
    print("Sarcina 1 finalizată.")
    group.leave() // Sarcina 1 s-a încheiat
}

group.enter() // Sarcina 2 a început
queue.async {
    print("Sarcina 2 se execută...")
    Thread.sleep(forTimeInterval: 2)
    print("Sarcina 2 finalizată.")
    group.leave() // Sarcina 2 s-a încheiat
}

group.notify(queue: .main) {
    print("Toate sarcinile din grup s-au finalizat cu notify.")
}

// Exemplu de utilizare a wait (blocant)
// group.wait()
// print("Toate sarcinile s-au finalizat cu wait.") // Acest cod va fi executat după finalizarea tuturor sarcinilor, blocând firul curent.