Quelles méthodes existent pour placer des tâches dans la file d'attente de Grand Central Dispatch (GCD) ?
sobes.tech IA
Réponse de l'IA
Il existe les méthodes suivantes pour placer des tâches dans la file d'attente GCD :
-
Exécution asynchrone (async) : La tâche est ajoutée à la file d'attente, et l'exécution continue immédiatement sur le thread actuel, sans attendre la fin de la tâche dans la file.
DispatchQueue.global().async { // Code de la tâche } -
Exécution synchrone (sync) : La tâche est ajoutée à la file d'attente, et le thread actuel est bloqué jusqu'à ce que la tâche dans la file se termine. Évitez d'utiliser sync sur le thread principal pour des tâches longues afin de ne pas bloquer l'UI.
DispatchQueue.global().sync { // Code de la tâche, le thread actuel attend } -
Exécution différée (asyncAfter) : La tâche est ajoutée à la file avec un délai spécifié. L'exécution commencera pas avant le temps indiqué.
DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) { // Le code de la tâche s'exécutera dans 2 secondes } -
Exécution en groupe (DispatchGroup) : Les tâches peuvent être ajoutées à un DispatchGroup pour synchroniser leur fin. On peut attendre que toutes soient terminées ou être notifié (notify) après leur fin.
let group = DispatchGroup() group.enter() DispatchQueue.global().async { // Tâche 1 group.leave() } group.enter() DispatchQueue.global().async { // Tâche 2 group.leave() } group.notify(queue: .main) { // Toutes les tâches du groupe sont terminées } -
Exécution d'itérations (concurrentPerform) : Permet d'exécuter un bloc de code
iterationsfois en parallèle sur une file concurrente.DispatchQueue.concurrentPerform(iterations: 100) { index in // Code exécuté pour chaque index en parallèle } -
DispatchWorkItem : Encapsule un bloc de code et permet d'annuler la tâche avant son démarrage ou après l'avoir ajoutée à la file, si elle n'a pas encore commencé.
var workItem: DispatchWorkItem? workItem = DispatchWorkItem { // Code de la tâche } DispatchQueue.global().async(execute: workItem!) // La tâche peut être annulée si elle n'a pas encore commencé // workItem?.cancel()