¿Es posible evitar que un NSURLRequest almacene datos en caché o elimine los datos en caché después de una solicitud?

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; } 

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 🙂

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.

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 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)

 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