Подтвердить что ты не робот

Как отключить кеширование в Alamofire

Когда я отправляю запрос GET дважды с помощью Alamofire, я получаю тот же ответ, но я ожидаю другого. Мне было интересно, было ли это из-за кеша, и если да, то я хотел бы знать, как отключить его.

4b9b3361

Ответ 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))
    }
}