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.
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)")
}
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.
This is what worked for me.
NSURLCache.sharedURLCache().removeAllCachedResponses()
Swift 3
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))
}
}
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
// ...
}
}
[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.
I solved it by doing
configuration.urlCache?.removeAllCachedResponses()
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
}
来源:https://stackoverflow.com/questions/32199494/how-to-disable-caching-in-alamofire