Cómo deshabilitar el almacenamiento en caching de NSURLSessionTask

En mi aplicación de iOS, estoy usando NSURLSessionTask para download datos json a mi aplicación. Descubrí que cuando llamo a la url directamente desde el browser, recibo un json actualizado y cuando se llama desde dentro de la aplicación, obtengo una versión anterior del json.

¿Esto se debe al almacenamiento en caching? ¿Cómo puedo decirle a NSURLSessionTask que no use caching?

Esta es la llamada que uso:

 NSURLSessionTask *task = [[NSURLSession shanetworkingSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

¡Gracias!

Si lees los enlaces de @runmad, puedes ver en el diagtwig de flujo que si el HEAD del file no ha cambiado, todavía usará la versión almacenada en caching cuando establezcas cachePolicy.

En Swift3 tuve que hacer esto para que funcione:

 let config = URLSessionConfiguration.default config.requestCachePolicy = .reloadIgnoringLocalCacheData config.urlCache = nil let session = URLSession.init(configuration: config) 

Obtuve una versión realmente no almacenada en caching del file, que necesitaba para cálculos de estimación de ancho de banda.

En lugar de utilizar shanetworkingSession , también puede crear su propia NSURLSession utilizando una NSURLSessionConfiguration que especifica una política de caching pnetworkingeterminada. Por lo tanto, defina una propiedad para su session:

 @property (nonatomic, strong) NSURLSession *session; 

Y entonces:

 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; configuration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; self.session = [NSURLSession sessionWithConfiguration:configuration]; 

Luego, las requestes que usen esa session usarán ese requestCachePolicy .

Swift 3, Xcode 8

 extension UIImageView { func donloadImage(fromUrl url: URL) { let request = URLRequest(url: url, cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 60.0) URLSession.shanetworking.dataTask(with: request) { (data, response, error) in guard let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200, let mimeType = response?.mimeType, mimeType.hasPrefix("image"), let data = data, error == nil, let image = UIImage(data: data) else { return } DispatchQueue.main.async() { () -> Void in self.image = image } }.resume() } 

El código siguiente funcionó para mí, la captura está estableciendo URLCache a cero.

  NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; config.URLCache = nil; 

cachePolicy configurar cachePolicy en NSURLRequest , aquí está la documentation .

Aquí hay una idea de cómo funciona el almacenamiento en caching en general.

Puede leer sobre las enumeraciones específicas que puede usar para especificar cachePolicy aquí en particular:

 enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, }; typedef NSUInteger NSURLRequestCachePolicy; 

Por ejemplo, haría:

 NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0]; 

Estaba recibiendo una image de caching para la misma url … así que hice esto

 imageView.imageFromUrl(self.shareData.userResponseData["photo"] as! String) extension UIImageView { public func imageFromUrl(urlString: String) { if let url = NSURL(string: urlString) { let request = NSURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: 60.0) NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in self.image = UIImage(data: data) } } } 

}