Files d'attente de tâches en Swift : Guide complet pour débutants

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction aux files d'attente de tâches en Swift

\n\n

Les applications mobiles et de bureau en Swift exécutent souvent plusieurs opérations simultanément : téléchargement de données depuis le réseau, traitement d'images, animation de l'interface. Sans une gestion appropriée de ces tâches, l'application peut "se bloquer" ou ralentir. Les files d'attente de tâches sont un mécanisme qui permet d'organiser l'exécution du code en arrière-plan, sans bloquer le thread principal (UI).

\n\n

En Swift, il existe trois approches principales pour travailler avec les files d'attente :

\n
    \n
  • Grand Central Dispatch (GCD) — une API de bas niveau pour gérer les files d'attente.
  • \n
  • OperationQueue — une abstraction de plus haut niveau au-dessus de GCD.
  • \n
  • async/await (Swift 5.5+) — une syntaxe asynchrone moderne.
  • \n
\n\n

Dans cet article, nous allons détailler chaque approche avec des exemples pratiques, compréhensibles même pour les débutants.

\n\n

1. Grand Central Dispatch (GCD) — la base des files d'attente

\n\n

GCD est une bibliothèque Apple qui gère un pool de threads. Vous créez simplement une file d'attente et y envoyez des tâches. Le système décide lui-même sur quel thread exécuter le code.

\n\n

Types de files d'attente dans GCD

\n
    \n
  • Main Queue — exécute les tâches sur le thread principal (uniquement les mises à jour de l'UI).
  • \n
  • Global Queues — files d'attente en arrière-plan avec différentes priorités (userInteractive, userInitiated, utility, background).
  • \n
  • Private Queues — vos propres files d'attente, que vous pouvez configurer comme séquentielles (serial) ou parallèles (concurrent).
  • \n
\n\n

Exemple : téléchargement de données en arrière-plan

\n
import UIKit\n\nclass ViewController: UIViewController {\n    \n    @IBOutlet weak var imageView: UIImageView!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        // Lance une tâche dans une file d'attente en arrière-plan\n        DispatchQueue.global(qos: .userInitiated).async {\n            let url = URL(string: "https://example.com/image.jpg")!\n            if let data = try? Data(contentsOf: url),\n               let image = UIImage(data: data) {\n                \n                // Retourne sur le thread principal pour mettre à jour l'UI\n                DispatchQueue.main.async {\n                    self.imageView.image = image\n                }\n            }\n        }\n    }\n}
\n\n

Files d'attente séquentielles vs parallèles

\n

Une file d'attente séquentielle exécute les tâches une par une. Une file d'attente parallèle peut lancer plusieurs tâches simultanément.

\n\n
// File d'attente séquentielle\nlet serialQueue = DispatchQueue(label: "com.example.serial")\nserialQueue.async { print("Tâche 1") }\nserialQueue.async { print("Tâche 2") }\n// Sortie : Tâche 1, puis Tâche 2\n\n// File d'attente parallèle\nlet concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)\nconcurrentQueue.async { print("Tâche A") }\nconcurrentQueue.async { print("Tâche B") }\n// Sortie : Tâche A ou Tâche B (ordre non garanti)
\n\n

2. OperationQueue — gestion des dépendances

\n\n

OperationQueue est une enveloppe plus pratique au-dessus de GCD, qui permet :

\n
    \n
  • Définir des dépendances entre les tâches.
  • \n
  • Annuler l'exécution des tâches.
  • \n
  • Gérer le nombre maximum d'opérations parallèles.
  • \n
\n\n

Création et exécution d'opérations

\n
let operationQueue = OperationQueue()\noperationQueue.maxConcurrentOperationCount = 2 // maximum 2 tâches simultanées\n\nlet operation1 = BlockOperation {\n    print("Opération 1 en cours")\n    Thread.sleep(forTimeInterval: 1)\n}\n\nlet operation2 = BlockOperation {\n    print("Opération 2 en cours")\n    Thread.sleep(forTimeInterval: 1)\n}\n\n// Définit une dépendance : operation2 ne commencera qu'après operation1\noperation2.addDependency(operation1)\n\noperationQueue.addOperations([operation1, operation2], waitUntilFinished: false)
\n\n

Annulation des opérations

\n

Blogs

Book Recommendations