que para otros limpiar cache borrar app aplicaciones almacenamiento ios caching nsurlsessiontask

ios - para - Cómo deshabilitar el almacenamiento en caché desde NSURLSessionTask



borrar cache whatsapp iphone (6)

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

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

Esta es la llamada que uso:

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

¡Gracias!


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

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


En lugar de usar sharedSession , también puede crear su propia NSURLSession usando NSURLSessionConfiguration que especifique una política de caché predeterminada. Por lo tanto, defina una propiedad para su sesión:

@property (nonatomic, strong) NSURLSession *session;

Y entonces:

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

Entonces las solicitudes que usan esa sesión usarán esa requestCachePolicy .


Estaba obteniendo una imagen de caché para la misma URL ... así que lo he hecho

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

}


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

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

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

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

Por ejemplo, harías:

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


Si lees los enlaces de @runmad, puedes ver en el diagrama de flujo que si el HEAD del archivo no se modifica, seguirá usando la versión en caché cuando configures 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 del archivo realmente no almacenada en caché, que necesitaba para cálculos de estimación de ancho de banda.


Swift 3, Xcode 8

extension UIImageView { func donloadImage(fromUrl url: URL) { let request = URLRequest(url: url, cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 60.0) URLSession.shared.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() }