Comment désactiver la mise en cache en Alamofire
quand J'envoie une requête GET deux fois avec Alamofire j'obtiens la même réponse mais j'attends une réponse différente. Je me demandais si c'était à cause de la cache, et si oui j'aimerais savoir comment le désactiver.
8 réponses
swift 3, alamofire 4
Ma solution est:
création d'une extension pour Alamofire:
extension Alamofire.SessionManager{
@discardableResult
open func requestWithoutCache(
_ url: URLConvertible,
method: HTTPMethod = .get,
parameters: Parameters? = nil,
encoding: ParameterEncoding = URLEncoding.default,
headers: HTTPHeaders? = nil)// also you can add URLRequest.CachePolicy here as parameter
-> DataRequest
{
do {
var urlRequest = try URLRequest(url: url, method: method, headers: headers)
urlRequest.cachePolicy = .reloadIgnoringCacheData // <<== Cache disabled
let encodedURLRequest = try encoding.encode(urlRequest, with: parameters)
return request(encodedURLRequest)
} catch {
// TODO: find a better way to handle error
print(error)
return request(URLRequest(url: URL(string: "http://example.com/wrong_request")!))
}
}
}
et en l'utilisant:
Alamofire.SessionManager.default
.requestWithoutCache("https://google.com/").response { response in
print("Request: \(response.request)")
print("Response: \(response.response)")
print("Error: \(response.error)")
}
vous avez quelques options.
désactiver complètement L'URLCache
let manager: Manager = {
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.URLCache = nil
return Manager(configuration: configuration)
}()
configurer la Politique de Cache des requêtes
let manager: Manager = {
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.requestCachePolicy = .ReloadIgnoringLocalCacheData
return Manager(configuration: configuration)
}()
les Deux approches devraient faire l'affaire pour vous. Pour plus d'informations, je vous suggérerais de lire la documentation pour Nurlsessionconfiguration et NSURLCache. Une autre excellente référence est L'article de NSHipster sur NSURLCache.
C'est ce qui a fonctionné pour moi.
NSURLCache.sharedURLCache().removeAllCachedResponses()
Swift 3
URLCache.shared.removeAllCachedResponses()
une Autre option si vous souhaitez utiliser l'partagé Alamofire gestionnaire serait de faire ceci:
Alamofire.Manager.sharedInstance.session.configuration.requestCachePolicy = .ReloadIgnoringLocalCacheData
après vous pouvez utiliser Alamofire.request(.GET, urlString)....
avec la nouvelle politique de cache.
Alamofire 4 et Swift 3:
// outside function, inside class
var sessionManager: SessionManager!
func someFunc() {
let configuration = URLSessionConfiguration.default
configuration.urlCache = nil
let sessionManager = Alamofire.SessionManager(configuration: configuration)
sessionManager.request("http://example.com/get").responseJSON { response in
// ...
}
}
[Cette approche n'a pas désactiver la mise en cache, il a simplement fait en sorte que les fichiers mis en cache ne sont pas réutilisés]
une façon plus facile de passer le problème de cache pour un appel particulier est d'ajouter un numéro aléatoire dans les paramètres de l'appel.
arc4random() pour générer un nombre aléatoire.func getImage(url: String, completion: @escaping (UIImage?) -> ()) {
let urlRequest = URLRequest(url: URL(string: url)!)
URLCache.shared.removeCachedResponse(for: urlRequest)
//URLCache.shared.removeAllCachedResponses()
Alamofire.request(url).responseData { (dataResponse) in
guard let data = dataResponse.data else {
return completion(nil)
}
completion(UIImage(data: data, scale:1))
}
}
je l'ai résolu en faisant
configuration.urlCache?.removeAllCachedResponses()