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