使用Alamofire发送两次GET请求时,我收到了相同的响应,但我期望得到不同的响应。我想知道是否是因为缓存造成的,如果是,我想知道如何禁用它。
你有几个选择。
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)
}()
这两种方法都可以解决你的问题。如需更多信息,建议阅读NSURLSessionConfiguration和NSURLCache的文档。另一个很好的参考资料是NSHipster有关NSURLCache的文章。
let manager: SessionManager = { let configuration = URLSessionConfiguration.default configuration.requestCachePolicy = .reloadIgnoringLocalCacheData return SessionManager(configuration: configuration) }()
- snakeoil这是对我有效的方法。
NSURLCache.sharedURLCache().removeAllCachedResponses()
Swift 3
URLCache.shared.removeAllCachedResponses()
didFinishLaunchWithOptions
中调用了它。 - Venkatesh ChejarlaSwift 3,Alamofire 4
我的解决方案是:
为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")!))
}
}
}
并使用它:
Alamofire.SessionManager.default
.requestWithoutCache("https://google.com/").response { response in
print("Request: \(response.request)")
print("Response: \(response.response)")
print("Error: \(response.error)")
}
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))
}
}
configuration.urlCache?.removeAllCachedResponses()
[这种方法并不会禁用缓存,它只是确保缓存文件不被重复使用]
解决特定调用的缓存问题的更简单方法是在调用参数中添加一个随机数。
对于Swift 3,您可以使用arc4random()
来生成随机数。
// 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
// ...
}
}
let headers = ["Authorization": "Bearer \(token)",
"Cache-Control": "no-cache"]
具体来说,在再次发出请求之前清除缓存的响应会更加合适,如下所示:
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
}
urlRequest.cachePolicy = .reloadIgnoringCacheData
已生效。 - Tancrede Chazallet