Introduction : Pourquoi la mise en cache dans les applications Swift ?
\nLa mise en cache est l'une des techniques clés d'optimisation des performances des applications mobiles et serveur. Dans le monde Swift (iOS/macOS), une mise en cache correcte permet de réduire le temps de chargement des données, de diminuer la charge sur le réseau et la base de données, et d'améliorer l'expérience utilisateur. Dans cet article, nous allons aborder trois approches principales de la mise en cache en Swift : la solution intégrée NSCache, les systèmes serveur populaires Redis et Memcached, ainsi que leur intégration dans les projets iOS/macOS.
1. Mise en cache intégrée : NSCache et URLCache
\nPour la plupart des applications iOS, aucun serveur externe n'est nécessaire — il suffit d'utiliser les mécanismes intégrés d'Apple.
\n\n1.1 NSCache — un cache mémoire simple et efficace
\nNSCache est un dictionnaire thread-safe qui supprime automatiquement les objets en cas de manque de mémoire. Idéal pour la mise en cache d'images, de réponses JSON ou de tout objet coûteux à calculer.
import Foundation\n\nclass ImageCache {\n private let cache = NSCache<NSString, NSData>()\n\n func setImageData(_ data: Data, forKey key: String) {\n cache.setObject(data as NSData, forKey: key as NSString)\n }\n\n func getImageData(forKey key: String) -> Data? {\n return cache.object(forKey: key as NSString) as Data?\n }\n}\nConseil : Configurez les limites countLimit et totalCostLimit pour des performances optimales.
1.2 URLCache — mise en cache des requêtes réseau
\nURLCache met automatiquement en cache les réponses HTTP sur le disque et en mémoire. La configuration se fait via URLSessionConfiguration :
let config = URLSessionConfiguration.default\nconfig.urlCache = URLCache(memoryCapacity: 50 * 1024 * 1024, // 50 MB\n diskCapacity: 100 * 1024 * 1024, // 100 MB\n diskPath: "myCache")\nlet session = URLSession(configuration: config)\nC'est particulièrement utile pour le contenu statique (images, réponses API à longue durée de vie).
\n\n2. Redis dans les projets Swift
\nRedis est un magasin de données en mémoire prenant en charge les structures (chaînes, listes, hachages). Dans les projets Swift côté serveur (Vapor, Perfect), Redis est utilisé pour les sessions, les files d'attente et le cache rapide.
\n\n2.1 Connexion à Redis via Vapor
\nVapor fournit le paquet vapor/redis. Installation :
// Package.swift\ndependencies: [\n .package(url: "https://github.com/vapor/redis.git", from: "4.0.0")\n]\nExemple de mise en cache des données utilisateur :
\nimport Vapor\nimport Redis\n\nfunc cacheUser(_ user: User, on request: Request) async throws {\n let key = "user:\\(user.id)"\n let data = try JSONEncoder().encode(user)\n try await request.redis.set(key, to: data)\n // Définition du TTL (durée de vie) 1 heure\n try await request.redis.expire(key, after: .hours(1))\n}\n\nfunc getUser(from request: Request, id: Int) async throws -> User? {\n let key = "user:\\(id)"\n guard let data = try await request.redis.get(key, as: Data.self) else {\n return nil\n }\n return try JSONDecoder().decode(User.self, from: data)\n}\n\n2.2 Avantages de Redis pour Swift
\n- \n
- Vitesse : les données sont stockées en RAM — latence inférieure à la milliseconde. \n
- TTL : expiration automatique des clés. \n
- Pub/Sub : communication asynchrone entre services. \n
3. Memcached : mise en cache distribuée légère
\nMemcached est un système de mise en cache plus ancien mais toujours populaire. Contrairement à Redis, il ne prend pas en charge les structures de données complexes ni la persistance, mais il est extrêmement simple et efficace pour le cache clé-valeur.
\n\n