swift caching nsurlsession nsurlcache nsurlsessionconfiguration

swift - Evitar que NSURLSession almacene en caché las respuestas



caching nsurlcache (3)

¿Por qué se cachean las respuestas. Devuelve respuestas previamente recuperadas. Incluso funciona si se apaga la conexión de red. Reiniciar el simulador de iOS tampoco pareció funcionar. Hacer una solicitud, entonces otra vez con internet sin conexión funciona (en caché).

public let urlSession: NSURLSession public init() { // ... var configuration = NSURLSessionConfiguration.defaultSessionConfiguration() configuration.requestCachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData urlSession = NSURLSession(configuration: configuration) } func makeRequest(path: String, httpMethod:String, body:String?, baseUrl: String?, headers:[String:String]=[:], callback: JsonRequestCallback) { let urlString = (baseUrl ?? customOAuth2Manager.API_URL) + path let url = NSURL(string: urlString) let request = oauthInstance.request(forURL: url!) request.HTTPMethod = httpMethod self.customOAuth2Manager.setupRequest(request) for (key, value) in headers { request.setValue(value, forHTTPHeaderField:key) } if let body = body where body != "" { let postData = (body as NSString).dataUsingEncoding(NSUTF8StringEncoding) request.HTTPBody = postData } let task = urlSession.dataTaskWithRequest(request) { data, response, error in self.parseData(data, response:response, error:error, body:body, callback: callback) } task.resume() }

Actualizar

didFinishLaunching resolverlo llamando a este código desde didFinishLaunching en el AppDelegate :

func removeUrlCache() { NSURLCache.setSharedURLCache(NSURLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)) }

Sin embargo, todavía tengo curiosidad por qué mi código original no funciona. También se siente un poco desagradable deshabilitar el caché de toda la aplicación para resolver mi problema.


Gracias por la pregunta. Me puso en el camino correcto.

Hay más posibilidades con NSURLCache.sharedURLCache() y no necesita cambiar la capacidad de la memoria y la capacidad del disco para esto.

Puede eliminar todas las respuestas en caché. Funciona para mi.

NSURLCache.sharedURLCache().removeAllCachedResponses()

O puede eliminar el caché para una sola respuesta. No funciona para mi iOS 9.

let request = NSURLRequest(URL: NSURL(string:url)!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData , timeoutInterval: 10) NSURLCache.sharedURLCache().removeCachedResponseForRequest(request) //Do your request here

Espero que ayude a alguien!

Edición: NSURLCache.sharedURLCache().removeCachedResponseForRequest(request) no está funcionando para mí desafortunadamente

Mi alternativa fue: uso esto para actualizar y estoy siguiendo la fecha de la última actualización. Así que estaba usando el siguiente código:

NSURLCache.sharedURLCache().removeCachedResponsesSinceDate(lastUpdate)

Pero por alguna razón esto no funciona.

Desde iOS 8, los métodos de eliminación de la caché única parecen estar dañados: https://.com/a/26343653/2826164


Implementaría URLSessionDelegate y llamaría a completedBlock con nil en la implementación del delegado willCache. Esta fue su solicitud nunca será chached


No estoy seguro de si esto evita realmente el chaching o simplemente fuerza una recarga nueva cada vez, pero esto es lo que funcionó para mí:

request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData

Aquí hay una captura de pantalla que muestra otras opciones en caso de que alguien pueda necesitarlas: