Disk Cache es un mecanismo para almacenar temporalmente datos en el disco del dispositivo, permitiendo a las aplicaciones iOS acelerar el acceso repetido a recursos previamente cargados. Según Apple Developer Documentation, 2024, Disk Cache reduce el uso de red, disminuye la carga de la batería y permite el funcionamiento de la aplicación en modo offline. iOS proporciona varios mecanismos de almacenamiento en caché incorporados: URLCache para solicitudes de red, NSCache para memoria RAM e implementaciones personalizadas a través del directorio Caches.
Puntos clave
Disk Cache es una tecnología para almacenar temporalmente datos en el almacenamiento permanente del dispositivo (memoria flash) con el fin de acelerar solicitudes posteriores a los mismos datos. A diferencia del caché RAM, Disk Cache conserva los datos después de reiniciar la aplicación e incluso el dispositivo.
iOS proporciona dos niveles principales de almacenamiento en caché: volátil (NSCache, memoria) y basado en disco (URLCache, sistema de archivos). El caché de disco es de 10 a 100 veces más lento que el volátil, pero significativamente más rápido que una solicitud de red — la diferencia puede ser de 2 a 3 órdenes de magnitud. La estrategia óptima utiliza un caché de dos niveles: memoria para datos calientes y disco para datos fríos.
Según Apple Performance Optimization Guide, 2023, un Disk Cache correctamente configurado reduce el tiempo de carga de contenido en un 60–80% para vistas repetidas y disminuye el consumo de tráfico en un 40–70%. Para aplicaciones con contenido multimedia (imágenes, video, audio), el almacenamiento en caché es un factor crítico de UX.
URLCache es una clase integrada de Foundation que implementa un caché combinado para solicitudes de URLSession. Guarda automáticamente las respuestas del servidor en disco y memoria, gestionando el tamaño del caché y las políticas de invalidación basadas en cabeceras HTTP como Cache-Control, Expires y ETag.
import Foundation
let cache = URLCache(
memoryCapacity: 50 * 1024 * 1024,
diskCapacity: 200 * 1024 * 1024,
diskPath: "network-cache"
)
URLCache.shared = cache
let config = URLSessionConfiguration.default
config.urlCache = cache
config.requestCachePolicy = .returnCacheDataElseLoad
let session = URLSession(configuration: config)
Políticas de almacenamiento en caché de URLCache determinan cuándo usar datos en caché y cuándo realizar una nueva solicitud. Las principales políticas incluyen: useProtocolCachePolicy (según cabeceras del servidor), reloadIgnoringLocalCacheData (siempre del servidor), returnCacheDataElseLoad (caché primero), returnCacheDataDontLoad (solo caché — modo offline).
Cache-Control es una cabecera HTTP que el servidor envía junto con la respuesta, especificando max-age (tiempo de vida en segundos), must-revalidate (verificar actualidad), no-cache (no usar sin verificación) y no-store (no almacenar en caché). iOS respeta estrictamente estas cabeceras automáticamente al usar URLCache con la política useProtocolCachePolicy.
Caché personalizado es necesario cuando el URLCache integrado es insuficiente — para almacenar imágenes procesadas, modelos de datos serializados o resultados de cálculos. En tales casos, los desarrolladores crean su propio sistema de almacenamiento en caché basado en el directorio Caches del Sandbox de la aplicación.
class DiskCache<T: Codable> {
private let cacheDir: URL
private let encoder = JSONEncoder()
private let decoder = JSONDecoder()
init() {
let paths = FileManager.default
.urls(for: .cachesDirectory,
in: .userDomainMask)
cacheDir = paths[0].appendingPathComponent(
"data-cache", isDirectory: true
)
try? FileManager.default
.createDirectory(at: cacheDir,
withIntermediateDirectories: true)
}
func set(value: T, for key: String) {
let url = cacheDir.appendingPathComponent(
SHA256.hash(key)
)
if let data = try? encoder.encode(value) {
try? data.write(to: url)
}
}
func get(for key: String) -> T? {
let url = cacheDir.appendingPathComponent(
SHA256.hash(key)
)
guard let data = try? Data(contentsOf: url) else { return nil }
return try? decoder.decode(T.self, from: data)
}
func clearAll() {
try? FileManager.default
.removeItem(at: cacheDir)
}
}
Estrategias de invalidación de caché determinan cuándo los datos almacenados se consideran obsoletos: TTL (Time-To-Live) — los datos viven un tiempo fijo después de la escritura; basada en eventos — invalidación por evento (por ejemplo, actualización de datos en el servidor); basada en versión — invalidación al cambiar la versión de API o el formato de datos; LRU (Least Recently Used) — eliminación automática de las entradas menos utilizadas al superar el límite de tamaño.
Regla práctica: TTL es adecuado para noticias y contenido que se vuelve obsoleto de manera predecible. Basada en eventos para datos gestionados por el servidor a través de notificaciones push. Basada en versión para configuraciones y cachés de modelos de datos. LRU es una opción universal para archivos multimedia con espacio de disco limitado.
El rendimiento de Disk Cache se mide mediante el hit ratio — el porcentaje de solicitudes satisfechas desde el caché sin llamada de red. Un hit ratio típico para un caché de imágenes bien configurado es del 70–90%, para respuestas API — 40–60%, para video en streaming — 30–50%.
| Tipo de datos | Hit ratio típico | Tamaño de caché recomendado |
|---|---|---|
| Imágenes | 70–90% | 100–500 MB |
| Respuestas API JSON | 40–60% | 10–50 MB |
| Video/Audio | 30–50% | 500 MB — 1 GB |
| Fuentes y recursos | 90–99% | 5–20 MB |
| Contenido web | 50–70% | 50–200 MB |
Limitaciones de Disk Cache en iOS: el sistema puede eliminar el contenido del directorio Caches en cualquier momento cuando falte espacio en disco. Este comportamiento no es configurable — iOS decide cuándo y qué archivos en caché eliminar. Por lo tanto, el caché no debe contener datos que no puedan recuperarse de la red u otras fuentes.
Impacto en la memoria flash: la escritura frecuente en Disk Cache acelera el desgaste del almacenamiento flash. iOS utiliza TRIM y wear leveling para minimizar el desgaste, pero se recomienda a los desarrolladores evitar escrituras excesivas: no actualizar el caché más de una vez cada 5 minutos para el mismo archivo; agrupar escrituras pequeñas; usar NSCache para datos temporales que no necesitan persistir en disco.
Caché de dos niveles es la arquitectura estándar para aplicaciones iOS: memoria (NSCache) para datos de acceso frecuente, y disco (URLCache o personalizado) para datos que deben persistir entre sesiones. Tiempo de vida en memoria — minutos, en disco — horas o días.
Almacenamiento en caché de imágenes: utiliza bibliotecas especializadas (Kingfisher, SDWebImage, Nuke) que implementan un caché de dos niveles con invalidación automática, gestión de memoria y escritura asíncrona en disco. Implementar un caché de imágenes personalizado requiere considerar decodificación, espacio de color y escalado.
Caché y seguridad: no almacenes datos confidenciales (contraseñas, tokens, datos personales) en disco sin cifrado. URLCache no cifra datos por defecto — usa NSFileProtection o cifrado a nivel de aplicación para contenido sensible. Para solicitudes de red autorizadas, usa la política .reloadIgnoringLocalCacheData.
Monitoreo del caché: realiza un seguimiento del hit ratio, el tamaño actual del caché y las escrituras por minuto. Si el hit ratio cae por debajo del 30%, el caché es ineficiente y requiere revisión de la estrategia o aumento de tamaño. Según Point-Free (2024), el monitoreo del caché es una de las prácticas de optimización de rendimiento más subestimadas en aplicaciones iOS.
Preguntas frecuentes
Disk Cache es una tecnología para almacenar datos en el disco del dispositivo para acelerar el acceso repetido. El URLCache integrado de iOS almacena en caché las respuestas HTTP, y los desarrolladores pueden crear cachés personalizados a través del directorio Caches.
RAM Cache (NSCache) almacena datos en la memoria RAM — más rápido, pero se pierde al reiniciar la aplicación. Disk Cache es más lento pero persiste entre sesiones. La estrategia óptima utiliza ambos niveles: memoria para datos calientes, disco para datos fríos.
Sí, el sistema puede eliminar el contenido del directorio Caches en cualquier momento cuando falte espacio en disco. Por lo tanto, nunca almacenes datos irrecuperables en el caché. Usa el directorio Documents para documentos de usuario.
El tamaño del caché depende del tipo de datos: 100–500 MB para imágenes, 10–50 MB para respuestas API, hasta 1 GB para video. Monitorea el hit ratio — si cae por debajo del 50%, aumenta el tamaño del caché o cambia la estrategia de invalidación.
URLCache.removeAllCachedResponses() limpia el caché integrado. Para caché personalizado, elimina archivos del directorio Caches a través de FileManager. Siempre proporciona al usuario la opción de limpiar el caché a través de la configuración de la aplicación.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también