web-dev-qa-db-fra.com

Comment désactiver la mise en cache dans Alamofire

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.

41
Rémi Telenczak

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)")
        }
30
Andrew

Vous avez quelques options.

Désactiver complètement l'URLCache

let manager: Manager = {
    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    configuration.URLCache = nil
    return Manager(configuration: configuration)
}()

Configuration de la stratégie de cache des demandes

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 .

42
cnoon

C'est ce qui a fonctionné pour moi.

NSURLCache.sharedURLCache().removeAllCachedResponses()

Swift

URLCache.shared.removeAllCachedResponses()
36
Allanah Douglas
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))
    }
}
3
Warif Akhand Rishi

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
        // ...
    }
}
2
He Yifei 何一非

[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.

2
Rao

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
}
0
ardarda

Je l'ai résolu en faisant

configuration.urlCache?.removeAllCachedResponses()
0
iAnurag