ios uiimage nsurlsession nscache

iOS: la mejor práctica para guardar imágenes localmente: NSCache vs Guardar en el directorio de documentos



uiimage nsurlsession (1)

NSCache y el almacenamiento persistente tienen propósitos muy diferentes. NSCache mantiene el elemento en la memoria y se usa para un rendimiento óptimo. Pero ocupa memoria (RAM) y realmente debe asegurarse de que si usa NSCache responda a las advertencias de memoria y purgue NSCache en esos casos. Y cuando la aplicación finaliza, NSCache se pierde.

El uso de la memoria caché de almacenamiento persistente (generalmente la carpeta Caches ) se usa para un fin diferente, lo que le evita tener que volver a recuperar el activo a través de alguna solicitud de red, pero no mantiene el recurso en la memoria. Esto lo convierte en un excelente mecanismo de caché en las sesiones de ejecución de la aplicación o en situaciones en las que puede haber encontrado presión en la memoria, NSCache , pero no quería recuperar el activo de la red.

Tenga en cuenta que menciono la carpeta Caches para el almacenamiento persistente, mientras que parecía presumir que uno usaría Documents carpeta Documents , pero hay dos consideraciones:

  1. Apple se está volviendo más particular acerca de las aplicaciones que solo usan Documents carpeta Documents para los datos del usuario que no se pueden recrear fácilmente, y el uso de la carpeta Caches para los datos que se recuperan fácilmente. Consulte los Fundamentos del sistema de archivos para obtener más información.

  2. A partir de iOS 11, solo debe almacenar documentos visibles para el usuario en la carpeta Documents (consulte WWDC 2017 Fall video, iOS Storage Best Practices ). Incluso si hubiera utilizado internamente archivos que no se pudieron reconstruir fácilmente, a menos que la intención fuera finalmente exponer al usuario a ellos, usaría el directorio de Application Support la Application Support , no la carpeta de Documents .

En pocas palabras, uno generalmente usaría la carpeta Caches para un caché basado en el almacenamiento persistente.

Tenga en cuenta que a menudo usaremos un mecanismo de caché de dos niveles. NSCache caché el recurso tanto en NSCache como en la carpeta Caches . Luego, cuando vaya a recuperar un recurso, primero verifique NSCache (realmente rápido), si no está allí, verifique el almacenamiento persistente, y si no está allí, vuelva a recuperar el activo de la red.

Habiendo dicho todo eso, para hacerlo aún más complicado, hay un tercer tipo de caché, la proporcionada por NSURLCache (es decir, NSURLSession y NSURLConnection almacenan en caché las respuestas a las solicitudes de red). Este caché está dictado por reglas mal documentadas (p. Ej., No almacena en caché ningún elemento individual cuyo tamaño exceda el 5% del tamaño total del caché) y está sujeto a los encabezados HTTP proporcionados por la respuesta de la red. Sin embargo, esta memoria caché funciona en gran medida de forma transparente para usted y proporciona memoria caché de almacenamiento persistente. A menudo puede disfrutar del comportamiento de almacenamiento en caché de NSURLCache sin ninguna intervención de su parte. Es transparente (cuando funciona).

Estoy desarrollando una aplicación similar a la de Instagram (vistas de tabla con celdas que contienen imágenes y algunas etiquetas).

Para todos los datos que obtengo de la base de datos, estoy usando la Tarea de Datos (porque no toma mucho para recibirlos), pero para las imágenes (que su URL obtengo con la solicitud de Datos), necesito guardar localmente para uso futuro (mejorar la experiencia del usuario).

Mi lógica es la siguiente: guardar en NSCache o en el directorio de documentos, las imágenes dentro de la carpeta con la fecha en que se descargaron (crearlo una vez y anexar todas las demás imágenes si es necesario) ( eliminaré todas las carpetas que no sean 7 días ), y luego para TableView, simplemente cargue si desde ahí, por lo que la vista de tabla se desplazará sin problemas y no cargará la url directamente desde su método de delegado. Entonces, ¿dónde está el mejor lugar para almacenarlos de acuerdo con mis necesidades, NSCache o Document Directory .

Esperando escuchar sus sugerencias, ¡Gracias!