En iPhone, realizo una solicitud HTTP usando NSURLRequest para una gran cantidad de datos. La asignación de objetos aumenta y asigno los datos en consecuencia. Cuando termino con los datos, los libero en consecuencia; sin embargo, los instrumentos no muestran ningún dato que se haya liberado.
Mi teoría es que, de forma predeterminada, las solicitudes HTTP se almacenan en caché, sin embargo, no quiero que mi aplicación de iPhone almacene en caché estos datos.
¿Hay alguna manera de borrar este caché después de una solicitud o evitar que se almacenen en caché en primer lugar?
Intenté usar todas las políticas de caché documentadas un poco como a continuación:
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
theRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
¡pero nada parece liberar la memoria!
cocoa-touch
caching
Nick Cartwright
fuente
fuente
Respuestas:
Por lo general, es más fácil crear la solicitud de esta manera.
Luego crea la conexión
e implementar el método connection: willCacheResponse: en el delegado. Solo devolver cero debería hacerlo.
fuente
NSURLRequestReloadIgnoringCacheData
e implementarlasconnection:willCacheResponse:
?connection:willCacheResponse:
permite no almacenar la respuesta en el caché.NSURLRequestReloadIgnoringCacheData
especifica que la conexión debe cargar la solicitud sin verificar la caché. El primero es presumiblemente lo que ayuda a administrar la asignación de memoria.Tengo el mismo problema en mi aplicación cuando solicité información de Twitter. En mi caso, no necesitaba conservar esas credenciales, así que simplemente las borro usando el siguiente código:
Espero que funcione para alguien :)
fuente
Si usa NSURLConnection, eche un vistazo al delegado:
Valor devuelto
La respuesta real en caché para almacenar en la caché. El delegado puede devolver cachedResponse sin modificar, devolver una respuesta en caché modificada o devolver nil si no se debe almacenar una respuesta en caché para la conexión.
fuente
Si está usando
NSURLSession
, otra solución para evitar que la solicitud y los parámetros se escriban en elCache.db
iOS crea dentro delCaches
directorio de la aplicación , es establecer la configuraciónNSURLCache
de la sesión en una memoria de tamaño 0 y una memoria caché de disco de tamaño 0, por ejemploo como se mencionó anteriormente establecido a nivel de caché global
Presumiblemente, es el 0 para el tamaño del disco lo que detiene la escritura de iOS en el disco, pero si tiene una política para hacerlo
reloadIgnoringLocalCacheData
, probablemente tampoco esté interesado en el almacenamiento en caché de la memoria.Nota: Esto evitará que se creen
Caches/Cache.db
(solicitudes y respuestas) oCaches/fsCachedData/
carpetas (datos de respuesta). Hemos decidido adoptar este enfoque en una aplicación por motivos de seguridad, ya que no queremos que nuestras solicitudes se almacenen nunca en la memoria caché del disco.Si alguien sabe si hay una manera de detener solo el almacenamiento en caché de solicitudes pero mantener el almacenamiento en caché de los datos de respuesta del mecanismo de carga de URL de iOS, me interesaría saberlo. (no hay API o documentación oficial sobre esto por lo que puedo decir)
fuente
Si no es específico para una sola solicitud (si desea deshabilitar el caché para toda la aplicación), la mejor opción es la siguiente: agregue este código en el delegado de la aplicación o según su necesidad en cualquier lugar
fuente
Suponiendo que el servidor está implementado correctamente, colocar el
Cache-Control:no-store
encabezado en la solicitud generará una respuesta del servidor con el mismo encabezado, lo que provocaráNSURLCache
que no se almacenen los datos de respuesta en el disco.Por lo tanto, no es necesario el enfoque de escopeta de deshabilitar
NSURLCache
el almacenamiento en caché de disco.PD: Agregar el encabezado debería funcionar para todos los marcos HTTP, como
AFNetworking
fuente