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.

32
demandé sur Julian 2015-08-25 11:47:29

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)")
        }
26
répondu Andrew 2017-12-25 08:10:23

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.

38
répondu cnoon 2015-08-26 15:09:59

C'est ce qui a fonctionné pour moi.

NSURLCache.sharedURLCache().removeAllCachedResponses()

Swift 3

URLCache.shared.removeAllCachedResponses()
28
répondu Allanah Douglas 2017-01-27 02:44:52

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.

6
répondu marosoaie 2016-04-25 11:59:17

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
        // ...
    }
}
2
répondu Yifei He 2016-12-15 10:21:41

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

2
répondu Rao 2017-11-15 11:25:57
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))
    }
}
2
répondu Warif Akhand Rishi 2017-12-18 13:04:15

je l'ai résolu en faisant

configuration.urlCache?.removeAllCachedResponses()
0
répondu iAnurag 2018-05-21 12:33:18