How to disable caching in Alamofire

IosSwiftCachingAlamofire

Ios Problem Overview


When I send a GET request twice with Alamofire I get the same response but I'm expecting a different one. I was wondering if it was because of the cache, and if so I'd like to know how to disable it.

Ios Solutions


Solution 1 - Ios

You have a few options.

Disabling the URLCache Completely
let manager: Manager = {
    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    configuration.URLCache = nil
    return Manager(configuration: configuration)
}()
Configuring the Request Cache Policy
let manager: Manager = {
    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    configuration.requestCachePolicy = .ReloadIgnoringLocalCacheData
    return Manager(configuration: configuration)
}()

Both approaches should do the trick for you. For more information, I'd suggest reading through the documentation for NSURLSessionConfiguration and NSURLCache. Another great reference is NSHipster article on NSURLCache.

Solution 2 - Ios

This is what worked for me.

NSURLCache.sharedURLCache().removeAllCachedResponses()

Swift 3

URLCache.shared.removeAllCachedResponses()

Solution 3 - Ios

swift 3, alamofire 4

My solution was:

creating extension for 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")!))
        }
    }
}

and using it:

Alamofire.SessionManager.default
            .requestWithoutCache("https://google.com/").response { response in
                print("Request: \(response.request)")
                print("Response: \(response.response)")
                print("Error: \(response.error)")
        }

Solution 4 - Ios

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))
    }
}

Solution 5 - Ios

In Alamofire 4 and 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
        // ...
    }
}
		

Solution 6 - Ios

> [This approach doesn't disable caching, it merely makes sure that > cached files aren't reused]

An easier way to get past cache problem for a particular call is to just add a random number in the call params.

For Swift 3, you can use, arc4random() to generate a random number.

Solution 7 - Ios

I solved it by doing

configuration.urlCache?.removeAllCachedResponses()

Solution 8 - Ios

You can try to add cache-control to your headers.

let headers = ["Authorization": "Bearer \(token)",
               "Cache-Control": "no-cache"]

Solution 9 - Ios

Specifically removing a cached response before firing that request again would be more appropriate like:

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
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionR&#233;mi TelenczakView Question on Stackoverflow
Solution 1 - IoscnoonView Answer on Stackoverflow
Solution 2 - IosAllanah FowlerView Answer on Stackoverflow
Solution 3 - IosAndrewView Answer on Stackoverflow
Solution 4 - IosWarif Akhand RishiView Answer on Stackoverflow
Solution 5 - IosHe Yifei 何一非View Answer on Stackoverflow
Solution 6 - IosNagendra RaoView Answer on Stackoverflow
Solution 7 - IosiAnuragView Answer on Stackoverflow
Solution 8 - IosLoraKucherView Answer on Stackoverflow
Solution 9 - IosardardaView Answer on Stackoverflow