Sobes.tech
Middle

Qu'est-ce qu'un groupe de dispatch dans le contexte du développement iOS?

sobes.tech IA

Réponse de l'IA

DispatchGroup — c'est un mécanisme de GCD (Grand Central Dispatch) qui permet de suivre la fin d'un groupe de tâches asynchrones et d'exécuter une action après leur achèvement. Utile pour coordonner le travail de plusieurs files d'attente ou threads.

Méthodes principales :

  • enter(): Informe le groupe qu'une tâche a commencé. Augmente le compteur interne du groupe.
  • leave(): Informe le groupe qu'une tâche a terminé. Diminue le compteur.
  • wait(): Bloque le thread actuel jusqu'à ce que le compteur du groupe soit zéro ou que le délai d'attente expire.
  • notify(queue:execute:): Enregistre un bloc de code qui sera exécuté de manière asynchrone sur la file spécifiée lorsque le compteur du groupe sera zéro.

Exemple d'utilisation de notify :

import Foundation

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

queue.async(group: group) {
    // Première tâche asynchrone
    print("Tâche 1 en cours...")
    Thread.sleep(forTimeInterval: 1)
    print("Tâche 1 terminée.")
}

queue.async(group: group) {
    // Deuxième tâche asynchrone
    print("Tâche 2 en cours...")
    Thread.sleep(forTimeInterval: 2)
    print("Tâche 2 terminée.")
}

// Exécuter ce bloc après que toutes les tâches du groupe soient terminées
group.notify(queue: .main) {
    print("Toutes les tâches du groupe sont terminées.")
}

// Pour démonstration de la nature non bloquante avec notify
print("Code après l'ajout des tâches")

Exemple alternatif avec enter() et leave() manuels :

import Foundation

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

group.enter() // La tâche 1 a commencé
queue.async {
    print("Tâche 1 en cours...")
    Thread.sleep(forTimeInterval: 1)
    print("Tâche 1 terminée.")
    group.leave() // La tâche 1 est terminée
}

group.enter() // La tâche 2 a commencé
queue.async {
    print("Tâche 2 en cours...")
    Thread.sleep(forTimeInterval: 2)
    print("Tâche 2 terminée.")
    group.leave() // La tâche 2 est terminée
}

group.notify(queue: .main) {
    print("Toutes les tâches du groupe sont terminées avec notify.")
}

// Exemple d'utilisation de wait (bloquant)
// group.wait()
// print("Toutes les tâches sont terminées avec wait.") // Ce code s'exécutera après la fin de toutes les tâches, bloquant le thread actuel.