Когда я отправляю запрос GET дважды с помощью Alamofire, я получаю тот же ответ, но я ожидаю другого. Мне было интересно, было ли это из-за кеша, и если да, то я хотел бы знать, как отключить его.
Как отключить кеширование в Alamofire
Ответ 1
swift 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)")
}
Ответ 2
У вас есть несколько вариантов.
Отключение полного URLCache
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.
Ответ 3
Это то, что сработало для меня.
NSURLCache.sharedURLCache().removeAllCachedResponses()
Swift 3
URLCache.shared.removeAllCachedResponses()
Ответ 4
Другой вариант, если вы хотите использовать общий менеджер Alamofire, должен сделать это:
Alamofire.Manager.sharedInstance.session.configuration.requestCachePolicy = .ReloadIgnoringLocalCacheData
Впоследствии вы можете использовать Alamofire.request(.GET, urlString)....
с новой политикой кэша.
Ответ 5
В Alamofire 4 и 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
// ...
}
}
Ответ 6
[Этот подход не отключает кеширование, он просто гарантирует, что кешированные файлы не используются повторно]
Более простой способ преодолеть проблему кэша для конкретного вызова состоит в том, чтобы просто добавить случайное число в параметры вызова.
Для Swift 3 вы можете использовать arc4random()
для генерации случайного числа.
Ответ 7
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))
}
}