Lorsque j'envoie deux fois une demande GET avec Alamofire, j'obtiens la même réponse mais j'attends une autre. Je me demandais si c'était à cause du cache, et si oui, j'aimerais savoir comment le désactiver.
Swift 3, alamofire 4
Ma solution était:
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.
let manager: Manager = {
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.URLCache = nil
return Manager(configuration: configuration)
}()
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 suggère de lire la documentation pour NSURLSessionConfiguration et NSURLCache . Une autre grande référence est l'article NSHipster sur NSURLCache .
C'est ce qui a fonctionné pour moi.
NSURLCache.sharedURLCache().removeAllCachedResponses()
Swift
URLCache.shared.removeAllCachedResponses()
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))
}
}
Dans Alamofire 4 et Swift:
// 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 ne désactive pas la mise en cache, elle garantit simplement que les fichiers mis en cache ne sont pas réutilisés]
Un moyen plus simple de résoudre le problème de cache passé pour un appel particulier consiste simplement à ajouter un nombre aléatoire dans les paramètres d'appel.
Pour Swift 3, vous pouvez utiliser, arc4random()
pour générer un nombre aléatoire.
Plus précisément supprimer une réponse mise en cache avant de relancer cette demande serait plus approprié comme:
let url = "http://google.com"
let urlRequest = URLRequest(url: URL(string: url)!)
URLCache.shared.removeCachedResponse(for: urlRequest)
Alamofire
.request(urlRequest)
.responseJSON(completionHandler: { response in
//handle response
}
Je l'ai résolu en faisant
configuration.urlCache?.removeAllCachedResponses()