Caché en Swift (iOS/macOS): Redis, NSCache y otras soluciones

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Caché en Swift (iOS/macOS): Redis y otras herramientas



El almacenamiento en caché es una de las estrategias clave para optimizar el rendimiento de aplicaciones móviles y de escritorio en Swift. Permite reducir el tiempo de carga de datos, disminuir la carga en la red y los servidores, y garantizar el funcionamiento de la aplicación en modo offline. En el ecosistema de Apple, están disponibles tanto mecanismos integrados (NSCache, URLCache) como soluciones de terceros, incluyendo la integración con Redis. En este artículo, analizaremos en detalle las principales herramientas de almacenamiento en caché para iOS y macOS con ejemplos de código.



1. Mecanismos de caché integrados en Foundation



NSCache — caché ligera en memoria

NSCache es una caché segura para subprocesos y administrada automáticamente que elimina objetos cuando hay poca memoria. Es ideal para el almacenamiento temporal de imágenes, datos de modelos o resultados de cálculos.



import Foundation

let imageCache = NSCache<NSString, UIImage>()

// Establecemos límitesimageCache.countLimit = 100 // Máximo 100 objetosimageCache.totalCostLimit = 50 * 1024 * 1024 // 50 MB

// Guardarfunc cacheImage(_ image: UIImage, forKey key: String) { imageCache.setObject(image, forKey: key as NSString, cost: image.size.width * image.size.height * 4)}

// Obtenerfunc getCachedImage(forKey key: String) -> UIImage? { return imageCache.object(forKey: key as NSString)}


Ventajas: simplicidad, limpieza automática, soporte para costo de objetos.

Desventajas: caché solo en memoria, sin persistencia.



URLCache — almacenamiento en caché de solicitudes HTTP

URLCache almacena automáticamente en caché las respuestas de URLSession. Funciona tanto en memoria como en disco. Se configura globalmente o para una sesión específica.



import Foundation

// Configuración de caché: 50 MB en memoria y 100 MB en discolet cache = URLCache(memoryCapacity: 50 * 1024 * 1024, diskCapacity: 100 * 1024 * 1024, diskPath: "myCache")URLCache.shared = cache

// Uso con URLSessionlet config = URLSessionConfiguration.defaultconfig.urlCache = cacheconfig.requestCachePolicy = .returnCacheDataElseLoadlet session = URLSession(configuration: config)

let request = URLRequest(url: URL(string: "https://api.example.com/data")!)let task = session.dataTask(with: request) { data, response, error in // Los datos se almacenarán en caché automáticamente}task.resume()


La gestión de la política de caché se realiza a través de los encabezados Cache-Control del servidor o requestCachePolicy.



2. Caché de archivos para acceso offline

Cuando se necesita conservar datos entre ejecuciones de la aplicación, se utiliza el almacenamiento en caché de archivos en el directorio Caches. Es útil para JSON, imágenes u objetos serializados.



import Foundation

class FileCache { private let fileManager = FileManager.default private lazy var cacheDirectory: URL = { let paths = fileManager.urls(for: .cachesDirectory, in: .userDomainMask) return paths[0].appendingPathComponent("DataCache", isDirectory: true) }() init() { try? fileManager.createDirectory(at: cacheDirectory, withIntermediateDirectories: true) } func save(data: Data, forKey key: String) { let fileURL = cacheDirectory.appendingPathComponent(key) try? data.write(to: fileURL) } func load(forKey key: String) -> Data? { let fileURL = cacheDirectory.appendingPathComponent(key) return try? Data(contentsOf: fileURL) } func clearAll() { try? fileManager.removeItem(at: cacheDirectory) try? fileManager.createDirectory(at: cacheDirectory, withIntermediateDirectories: true) }}


3. Redis — caché distribuido para el lado del servidor

Recommendations