Introduction : pourquoi cette question est-elle si populaire ?
\n\nQuiconque a déjà écrit une application iOS a été confronté à la tâche : « Comment afficher une image depuis Internet dans mon application ? » Sur Stack Overflow, la question « Loading/Downloading image from URL on Swift » a recueilli des milliers de vues et des centaines de réponses. Pourquoi ? Parce que c'est la base avec laquelle commence le travail réseau sous iOS. Et même si tout semble simple — prendre une URL, télécharger les données, les afficher — en pratique, les développeurs rencontrent de nombreux pièges : blocage du thread principal, fuites mémoire, absence de cache et lenteur d'exécution.
\n\nDans cet article, nous allons passer en revue toutes les méthodes populaires pour télécharger des images depuis une URL en Swift, répondre aux questions fréquentes et montrer des exemples de code que vous pouvez utiliser immédiatement dans votre projet.
\n\n1. La méthode la plus simple : URLSession + Data
\n\nCommençons par le classique. En Swift, pour télécharger des données via le réseau, on utilise URLSession. Voici à quoi ressemble un code fonctionnel minimal :
import UIKit\n\nfunc loadImage(from urlString: String, completion: @escaping (UIImage?) -> Void) {\n guard let url = URL(string: urlString) else {\n completion(nil)\n return\n }\n \n URLSession.shared.dataTask(with: url) { data, response, error in\n guard let data = data, error == nil else {\n completion(nil)\n return\n }\n let image = UIImage(data: data)\n DispatchQueue.main.async {\n completion(image)\n }\n }.resume()\n}\n\n\nImportant : nous transmettons le résultat au thread principal via DispatchQueue.main.async. Si vous ne le faites pas, vous risquez un crash en essayant de mettre à jour l'interface utilisateur depuis un thread d'arrière-plan.
Comment l'utiliser :
\n\nloadImage(from: "https://example.com/image.jpg") { image in\n self.imageView.image = image\n}\n\n\nCette méthode convient aux projets simples où vous devez charger 1 à 2 images. Mais pour des applications réelles, elle n'est pas optimale : pas de mise en cache, pas de gestion des erreurs, et tout ralentira lors du défilement d'un tableau.
\n\n2. Approche moderne : async/await (Swift 5.5+)
\n\nDepuis iOS 15 et Swift 5.5, il est possible d'écrire du code asynchrone de manière impérative avec async/await. Le téléchargement d'une image devient élégant et lisible :
import UIKit\n\nfunc loadImageAsync(from urlString: String) async throws -> UIImage? {\n guard let url = URL(string: urlString) else {\n throw URLError(.badURL)\n }\n \n let (data, _) = try await URLSession.shared.data(from: url)\n return UIImage(data: data)\n}\n\n\nUtilisation dans SwiftUI :
\n\nstruct ContentView: View {\n @State private var image: UIImage?\n \n var body: some View {\n VStack {\n if let image = image {\n Image(uiImage: image)\n .resizable()\n .scaledToFit()\n } else {\n ProgressView()\n }\n }\n .task {\n do {\n image = try await loadImageAsync(from: "https://example.com/image.jpg")\n } catch {\n print("Erreur de chargement : \\(error)")\n }\n }\n }\n}\n\n\nPourquoi est-ce génial ? Le code devient linéaire, sans fermetures imbriquées, et facile à lire. Cependant, le problème de mise en cache persiste — nous téléchargeons toujours l'image à chaque fois.
\n\n3. Mise en cache : comment ne pas gaspiller le forfait data de l'utilisateur
\n\nLa question la plus fréquente posée par les débutants : « Pourquoi mes images se téléchargent-elles à chaque défilement du tableau ? » La réponse est simple — vous n'utilisez pas de cache.
\n\niOS dispose d'un URLCache intégré qui peut être configuré pour URLSession. Mais pour les images, il est préférable d'utiliser NSCache — il gère automatiquement