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!
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.
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
.
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()
}
Le code ci-dessous a fonctionné pour moi, la capture met URLCache à néant
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
config.URLCache = nil;
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)
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 cachePolicy
here 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];
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)
}
}
}
}