Files d'attente et tâches en arrière-plan en Swift : écrire du code qui ne ralentit pas

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

Files d'attente et tâches en arrière-plan en Swift : comment faire voler votre application

\n\n

Imaginez : vous ouvrez une application pour commander une pizza, vous appuyez sur « Voir le menu », et l'écran se fige pendant cinq secondes. Vous commencez à stresser, la pizza semble moins appétissante, l'application finit à la poubelle. Une douleur familière ? Si vous êtes développeur Swift, vous avez sûrement déjà rencontré une situation où l'interface « ralentit » à cause d'opérations lourdes — chargement d'images, analyse JSON ou calculs complexes. Le secret d'une UX fluide réside dans une bonne gestion des files d'attente et des tâches en arrière-plan.

\n\n

Dans cet article, nous allons voir comment organiser le multithreading en Swift : du GCD classique et OperationQueue jusqu'au moderne async/await. Vous apprendrez à décharger le travail lourd du thread principal, à éviter les blocages et à écrire un code rapide et prévisible. C'est parti !

\n\n

Pourquoi une file d'attente n'est pas comme faire la queue au supermarché

\n\n

En Swift, une file d'attente n'est pas l'endroit où vous attendez avec votre caddie. Les files d'attente (DispatchQueue) sont un mécanisme de gestion des tâches. Imaginez que vous avez plusieurs cuisiniers (threads). Un cuisinier sert la salle (thread principal — UI), tandis que les autres cuisinent en cuisine (threads en arrière-plan). Si vous forcez le serveur à cuire un steak, la salle s'arrête. Il en va de même pour l'interface : toutes les mises à jour de l'UI doivent se faire uniquement sur le thread principal, tout le reste en arrière-plan.

\n\n

En Swift, il existe deux types de files d'attente :

\n
    \n
  • Serial (séquentielle) — les tâches s'exécutent les unes après les autres. Idéal pour protéger les ressources partagées.
  • \n
  • Concurrent (parallèle) — les tâches démarrent simultanément. Parfait pour le chargement d'images ou les calculs parallèles.
  • \n
\n\n

Le système gère lui-même le pool de threads, vous n'avez donc pas besoin de les créer manuellement. Dites simplement : « Fais ça en arrière-plan, puis retourne le résultat sur le thread principal ». Et Swift le fait avec élégance.

\n\n

GCD (Grand Central Dispatch) — un vieil ami qui reste indispensable

\n\n

Grand Central Dispatch est une API de bas niveau apparue à l'époque d'Objective-C. Elle est toujours vivante et bien portante, et tout développeur Swift devrait la connaître. Le travail principal s'effectue via DispatchQueue.

\n\n

Voici l'exemple le plus simple — charger des données en arrière-plan et mettre à jour l'UI :

\n\n
import UIKit\n\nclass ViewController: UIViewController {\n    @IBOutlet weak var imageView: UIImageView!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        loadImage()\n    }\n    \n    func loadImage() {\n        // On passe à la file d'attente en arrière-plan\n        DispatchQueue.global(qos: .background).async {\n            // Travail lourd : chargement de l'image\n            guard let url = URL(string: "https://example.com/pizza.jpg"),\n                  let data = try? Data(contentsOf: url),\n                  let image = UIImage(data: data) else {\n                return\n            }\n            \n            // On revient 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

Remarquez le qos (Quality of Service). C'est la priorité de la tâche : .userInteractive pour les animations, .background pour la synchronisation, .utility pour les indicateurs de progression. Un bon choix de QoS aide le système à répartir les ressources.

\n\n

DispatchGroup : attendre tout le monde, pas un seul

\n\n

Imaginez que vous devez charger trois images et ne les afficher qu'ensuite. Sans DispatchGroup, vous lanceriez trois requêtes asynchrones sans savoir quand elles se terminent toutes. La solution : le groupe :

\n\n
func loadMultipleImages() {\n    let group = DispatchGroup()\n    var images: [UIImage] = []\n    \n    let urls = ["url1", "url2", "url3"]\n    \n    for urlString in urls {\n        group.enter() // On entre dans le groupe\n        DispatchQueue.global().async {\n            // Chargement                

Blogs

Book Recommendations