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: