cocoa touch - porque - ¿Es posible evitar que un NSURLRequest almacene datos en caché o elimine los datos en caché después de una solicitud?
que es cache en informatica (6)
En iPhone, realizo una solicitud HTTP usando NSURLRequest para un fragmento de datos. Picos de asignación de objetos 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 haya sido liberado!
Mi teoría es que, por defecto, las solicitudes HTTP están en la memoria caché, sin embargo, no quiero que mi aplicación de iPhone guarde en caché esta información.
¿Hay alguna manera de borrar este caché después de una solicitud o evitar que se almacenen datos en primer lugar?
Intenté usar todas las políticas de caché documentadas de la siguiente manera:
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
theRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
¡pero nada parece liberar la memoria!
Por lo general, es más fácil crear la solicitud de esta manera
NSURLRequest *request = [NSURLRequest requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:60.0];
Luego crea la conexión
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request
delegate:self];
e implementar la conexión: willCacheResponse: método en el delegado. Solo devolviendo nada debería hacerlo.
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse {
return nil;
}
Si está utilizando NSURLSession
, otra solución para evitar solicitudes y parámetros escritos en Cache.db
iOS crea dentro del directorio Caches
la aplicación, es configurar NSURLCache
para la configuración de la sesión en una memoria de tamaño 0 y caché de disco de tamaño 0, por ejemplo
let configuration = URLSessionConfiguration.default
configuration.urlCache = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)
let session = URLSession(configuration: configuration)
o como se mencionó anteriormente establecido en un nivel de caché global
URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)
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 reloadIgnoringLocalCacheData
entonces probablemente tampoco le interese el almacenamiento en memoria caché.
Nota Esto evitará que se Caches/Cache.db
(solicitudes y respuestas) o Caches/fsCachedData/
carpeta (datos de respuesta). Hemos decidido utilizar este enfoque en una aplicación por motivos de seguridad, ya que no queremos que nuestras solicitudes se almacenen en la memoria caché de disco.
Si alguien sabe que hay una manera de detener solo el caché de solicitudes pero mantener el caché de datos de respuesta desde el mecanismo de carga de URL de iOS, me gustaría saberlo. (No hay API o documentación oficial sobre esto por lo que puedo decir)
Si no es específico para una sola solicitud (U quiere desactivar la caché para toda la aplicación), debajo de una, es la mejor opción. Agregue este código en la aplicación delegada o en función de su necesidad en cualquier lugar.
int cacheSizeMemory = 0*4*1024*1024; // 0MB
int cacheSizeDisk = 0*32*1024*1024; // 0MB
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
[NSURLCache setSharedURLCache:sharedCache];
Si usa NSURLConnection eche un vistazo al delegado:
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse
Valor de retorno
La respuesta en caché real para almacenar en el caché. El delegado puede devolver cachedResponse sin modificar, devolver una respuesta en caché modificada o devolver nil si no se debe almacenar ninguna respuesta en caché para la conexión.
Tengo el mismo problema en mi aplicación cuando solicité información de Twitter. En mi caso, no necesité conservar esas credenciales, así que simplemente las borré usando el siguiente código:
- (void) eraseCredentials{
NSURLCredentialStorage *credentialsStorage = [NSURLCredentialStorage sharedCredentialStorage];
NSDictionary *allCredentials = [credentialsStorage allCredentials];
//iterate through all credentials to find the twitter host
for (NSURLProtectionSpace *protectionSpace in allCredentials)
if ([[protectionSpace host] isEqualToString:@"twitter.com"]){
//to get the twitter''s credentials
NSDictionary *credentials = [credentialsStorage credentialsForProtectionSpace:protectionSpace];
//iterate through twitter''s credentials, and erase them all
for (NSString *credentialKey in credentials)
[credentialsStorage removeCredential:[credentials objectForKey:credentialKey] forProtectionSpace:protectionSpace];
}
}
Espero que funcione para alguien :)
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] url];
[request setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
Suponiendo que el servidor está implementado correctamente, colocar el encabezado Cache-Control:no-store
en la solicitud generará una respuesta del servidor con el mismo encabezado, lo que ocasionará que NSURLCache
no almacene los datos de respuesta en el disco.
Por lo tanto, no es necesario NSURLCache
enfoque de NSURLCache
deshabilitar el almacenamiento en caché del disco NSURLCache
.
PD: Agregar el encabezado debería funcionar para todos los marcos HTTP, como AFNetworking