Sobes.tech
Middle

Quels outils sont disponibles dans Grand Central Dispatch (GCD) ?

sobes.tech IA

Réponse de l'IA

Principaux outils de GCD:

  • Files d'attente de dispatch (Dispatch Queues): Gèrent l'exécution de blocs de code. Elles peuvent être:
    • Séquentielles (Serial): Exécutent les tâches une par une, garantissant l'ordre.
    • Parallèles (Concurrent): Exécutent les tâches simultanément (dans la limite des ressources système disponibles).
  • Files d'attente parallèles globales (Global Concurrent Queues): Fournies par le système, ont des priorités prédéfinies (classes de qualité de service - QoS).
  • File principale (Main Queue): Une file séquentielle spéciale liée au thread principal de l'application. Utilisée pour travailler avec l'UI.
  • Groupes de dispatch (Dispatch Groups): Permettent de suivre la fin d'un ensemble de tâches asynchrones.
  • Sémantique de barrière (Barrier Semantics): Pour les files parallèles, permet de créer une "barrière" après laquelle seules les tâches placées après la barrière sont exécutées, jusqu'à ce que celle-ci soit franchie.
  • Sources de dispatch (Dispatch Sources): Permettent de réagir aux événements du système (opérations de fichiers, signaux, temporisateurs, etc.).
  • DispatchWorkItem: Encapsule un bloc de code et peut être envoyé à une file, annulé et notifié à la fin.

Exemple de création d'une file séquentielle et d'exécution d'une tâche:

let serialQueue = DispatchQueue(label: "com.example.serialQueue")

serialQueue.async {
    // Exécuté de manière asynchrone dans la file séquentielle
    print("Tâche exécutée dans la file séquentielle")
}

Exemple d'utilisation d'un groupe de dispatch:

let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

group.enter() // Entrer dans le groupe
concurrentQueue.async {
    // Tâche 1
    print("Tâche 1 terminée")
    group.leave() // Sortir du groupe
}

group.enter() // Entrer dans le groupe
concurrentQueue.async {
    // Tâche 2
    print("Tâche 2 terminée")
    group.leave() // Sortir du groupe
}

group.notify(queue: .main) {
    // S'exécute après la fin de toutes les tâches du groupe
    print("Toutes les tâches du groupe sont terminées")
}

Exemple d'utilisation de DispatchWorkItem:

let workItem = DispatchWorkItem {
    print("WorkItem exécuté")
}

DispatchQueue.global().async(execute: workItem)

// workItem.cancel() // Peut être annulé avant l'exécution