web-dev-qa-db-fra.com

Comment désactiver la mise en cache de NSURLSessionTask

Dans mon application iOS, j'utilise NSURLSessionTask pour télécharger des données JSON sur mon application. J'ai découvert que lorsque j'appelle l'URL directement à partir du navigateur, je reçois un json à jour et lorsqu'il est appelé depuis l'application, je reçois une version plus ancienne du json.

Est-ce dû à la mise en cache? Comment puis-je dire à NSURLSessionTask de ne pas utiliser la mise en cache.

C'est l'appel que j'utilise:

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

Merci!

33
Van Du Tran

Si vous lisez les liens de @runmad, vous pouvez voir dans l'organigramme que si le HEAD du fichier n'est pas modifié, il utilisera toujours la version mise en cache lorsque vous définissez cachePolicy. 

Dans Swift3, je devais le faire pour que cela fonctionne:

let config = URLSessionConfiguration.default
config.requestCachePolicy = .reloadIgnoringLocalCacheData
config.urlCache = nil

let session = URLSession.init(configuration: config)

Cela donnait une version vraiment non mise en cache du fichier, ce dont j'avais besoin pour les calculs d'estimation de la bande passante.

35
Dave Haupert

Plutôt que d'utiliser sharedSession, vous pouvez également créer votre propre NSURLSession en utilisant un NSURLSessionConfiguration qui spécifie une stratégie de cache par défaut. Alors, définissez une propriété pour votre session:

@property (nonatomic, strong) NSURLSession *session;

Et alors:

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

Ensuite, les demandes utilisant cette session utiliseront cette requestCachePolicy.

35
Rob

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()
}
6
Gurjit Singh

Le code ci-dessous a fonctionné pour moi, la capture met URLCache à néant 

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

Swift 4.2

Je sais que cela fait longtemps, mais au cas où cela pourrait aider quelqu'un à l'avenir.

Vous pouvez également utiliser la propriété de configuration .ephemeral de URLSession, qui n'enregistre aucun cookie ni aucun cache par défaut.

Comme la documentation va,

Un objet de configuration de session éphémère est similaire à une configuration de session par défaut, à la différence que l’objet de session correspondant ne stocke pas de caches, de banques d’informations d’identité ni de données relatives à la session sur le disque. Au lieu de cela, les données liées à la session sont stockées dans la RAM.

Donc, votre code pourrait ressembler à ceci:

let configuration = URLSessionConfiguration.ephemeral
let session = URLSession(configuration: configuration)
2
joliejuly

Vous devez définir la cachePolicy sur NSURLRequest, voici la documentation .

Voici quelques informations sur le fonctionnement de la mise en cache en général.

Vous pouvez en savoir plus sur les énumérations spécifiques que vous pouvez utiliser pour spécifier la variable cachePolicyhere en particulier:

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

Par exemple, vous feriez:

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

J'obtenais l'image de cache pour la même URL .. donc j'ai fait cela 

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)

        }
    }
}

}

0
Vinod Joshi