web-dev-qa-db-ja.com

Alamofireでキャッシュを無効にする方法

AlamofireでGETリクエストを2回送信すると、同じ応答が返されますが、別の応答が期待されます。キャッシュが原因かどうか疑問に思っていたので、キャッシュを無効にする方法を知りたいのですが。

41
Rémi Telenczak

スイフト3、アラモファイア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)")
        }
30
Andrew

いくつかのオプションがあります。

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 のドキュメントを読むことをお勧めします。もう1つの優れたリファレンスは、 NSURLCache に関するNSHipsterの記事です。

42
cnoon

これは私のために働いたものです。

NSURLCache.sharedURLCache().removeAllCachedResponses()

Swift

URLCache.shared.removeAllCachedResponses()
36
Allanah Douglas
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))
    }
}
3

Alamofire 4およびSwiftで:

// 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
        // ...
    }
}
2

[このアプローチはキャッシュを無効にせず、キャッシュされたファイルが再利用されないことを確認するだけです]

特定の呼び出しの過去のキャッシュ問題を取得する簡単な方法は、呼び出しパラメーターに乱数を追加することです。

Swift 3)の場合、arc4random()を使用して乱数を生成できます。

2
Rao

具体的には、キャッシュされた応答を削除するは、その要求を再度実行する前に、より適切です:

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
}
0
ardarda

して解決しました

configuration.urlCache?.removeAllCachedResponses()
0
iAnurag