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