Introduction : Pourquoi mettre en cache dans les applications Swift ?
Les applications iOS et macOS modernes travaillent avec de grands volumes de données : images, réponses JSON d'API, résultats de calculs. Sans mise en cache, chaque accès aux données entraîne un rechargement ou un recalcul, ce qui impacte négativement les performances, la consommation de données et le temps de réponse. La mise en cache en Swift est une stratégie de stockage temporaire des données fréquemment utilisées dans un stockage rapide (RAM ou disque local) pour accélérer l'accès.
Dans cet article, nous examinerons trois approches principales de mise en cache dans l'écosystème Swift :
- Solutions intégrées :
NSCacheetURLCache— des outils légers et efficaces pour la plupart des tâches. - Redis — un cache serveur puissant pour les systèmes distribués.
- Memcached — un système de mise en cache en mémoire haute performance.
Vous apprendrez comment intégrer chacun de ces outils dans un projet Swift, verrez des exemples de code et comprendrez quelle option choisir pour une tâche spécifique.
Solutions intégrées : NSCache et URLCache
Apple fournit deux mécanismes de mise en cache intégrés puissants qui ne nécessitent pas l'installation de bibliothèques tierces. Ils sont parfaits pour 90% des tâches en développement mobile.
NSCache — mise en cache en mémoire
NSCache est un dictionnaire thread-safe avec gestion automatique de la mémoire. Il supprime automatiquement les objets en cas de manque de RAM, ce qui le rend idéal pour la mise en cache d'images, de modèles de données et de tout objet lourd.
import Foundation
// Création d'un cache pour UIImagelet imageCache = NSCache<NSString, UIImage>()
// Fonction de chargement d'image avec mise en cachefunc loadImage(from url: URL, completion: @escaping (UIImage?) -> Void) { // Vérification du cache if let cachedImage = imageCache.object(forKey: url.absoluteString as NSString) { completion(cachedImage) return } // Chargement des données URLSession.shared.dataTask(with: url) { data, response, error in guard let data = data, let image = UIImage(data: data) else { completion(nil) return } // Sauvegarde dans le cache imageCache.setObject(image, forKey: url.absoluteString as NSString) completion(image) }.resume()}Avantages de NSCache :
- Nettoyage automatique en cas d'avertissement mémoire
- Sécurité des threads sans verrous supplémentaires
- Possibilité de définir une limite sur le nombre d'objets et le coût total
URLCache — mise en cache des réponses HTTP
URLCache est un cache système pour les requêtes HTTP. Il enregistre les réponses du serveur sur le disque et en mémoire, en gérant automatiquement leur durée de vie en fonction des en-têtes HTTP (Cache-Control, Expires).
import Foundation
// Configuration d'URLCache (généralement dans AppDelegate ou SceneDelegate)let cacheSize = 50 * 1024 * 1024 // 50 MBlet urlCache = URLCache(memoryCapacity: cacheSize, diskCapacity: cacheSize, diskPath: "myCache")URLCache.shared = urlCache
// Exemple de requête avec mise en cachelet request = URLRequest(url: URL(string: "https://api.example.com/data")!)URLSession.shared.dataTask(with: request) { data, response, error in // URLCache gère automatiquement la mise en cache // en fonction des en-têtes Cache-Control}.resume()Quand utiliser URLCache :
- Pour la mise en cache des réponses d'API REST
- Pour les ressources statiques (images, fichiers de configuration)
- Lorsqu'il faut respecter la politique de cache du serveur
Redis — cache distribué pour la partie serveur Swift
Redis est un magasin de données en mémoire haute performance, souvent utilisé comme serveur de cache. Pour Swift, il existe plusieurs clients, le plus popul