【问题标题】:Swift 4 - Alamofire - How to disable cache on requestSwift 4 - Alamofire - 如何根据请求禁用缓存
【发布时间】:2020-01-14 14:58:54
【问题描述】:

我有这样的 Alamofire 请求:

func loginUser(_ username: String, password: String, completion: @escaping (_ result: Bool) -> Void)
    {

        let user = username

        let password = password

        let url = webservice

        let credential = URLCredential(user: user, password: password, persistence: .none)

        let headers = ["Accept": "application/json;odata=verbose", "Content-type": "application/json;odata=verbose"]

        Alamofire.request(url, method: .get, headers: headers).authenticate(usingCredential: credential).responseJSON {
                (response) in

                print(response.result)

                switch response.result {

                case .success:
                    if let value = response.result.value {

                        completion(true)

                    }else{

                        print("There is error in the server response")

                        completion(false)
                    }

                case .failure (let error):

                    print("The NTLM request error is: ", error.localizedDescription)

                    completion(false)

                }

            }

    }

我的问题是当我在使用有效凭据后使用无效凭据时它可以工作,而不是吐出错误。有人告诉我这可能是一个缓存问题,所以我的问题是如何禁用此请求的缓存?

我已尝试将此添加到我的请求顶部:

URLCache.shared.removeAllCachedResponses()

但这没有用

我也看到了:

urlRequest.cachePolicy = .reloadIgnoringCacheData

但我不知道在哪里应用它。

请帮忙!

更新

我尝试了以下方法:

func loginUser(_ username: String, password: String, completion: @escaping (_ result: Bool) -> Void)
    {

        let user = username

        let password = password

        let url = webservice

        let credential = URLCredential(user: user, password: password, persistence: .none)

        var urlRequest = URLRequest(url: URL(string: url)!)

        urlRequest.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData

        urlRequest.httpMethod = "get"

        urlRequest.setValue("application/json;odata=verbose", forHTTPHeaderField: "Content-type")

        urlRequest.setValue("application/json;odata=verbose", forHTTPHeaderField: "Accept")

        Alamofire.request(urlRequest).authenticate(usingCredential: credential).responseJSON {
                (response) in

                switch response.result {

                case .success:
                    if let value = response.result.value {


                       completion(true)

                    }else{

                        print("There is error in the server response")

                        completion(false)
                    }

                case .failure (let error):

                    print("The NTLM request error is: ", error.localizedDescription)

                    completion(false)

                }

            }

    }

但这没有用,结果相同。

【问题讨论】:

    标签: ios swift alamofire


    【解决方案1】:

    您可以使用特定的URLSessionConfiguration 实例化Alamofire.SessionManager。在配置中,您可以设置 cachePolicy。这可能看起来像这样:

    let configuration = URLSessionConfiguration.default
    configuration.requestCachePolicy = .useProtocolCachePolicy // or whatever you want
    configuration.urlCache = nil
    let mySessionManager = Alamofire.SessionManager(configuration: configuration)
    

    然后按如下方式使用:

    mySessionManager.request(urlRequest)....

    请注意,如果您按照此操作,则必须使用 mySessionManager 来执行请求,而不是使用 Alamofire.request

    要使用 mySessionManager 发出请求,基本相同,而不是 Alamofire.request(urlRequest)... 你使用 mySessionManager.request(urlRequest)...

    【讨论】:

    • 我将如何执行 mySessionManager 请求?
    • 没有成员 'mySessionManager' 我必须在某个地方定义它吗?
    • @user979331 我首先将它声明为类的属性。我再次编辑,希望现在更清晰。
    • 我尝试了 mySessionManager,当我这样做时,它直接进入 .failure 案例,说 NTLM 请求错误是:已取消
    • 是的,无论我做什么,它都失败了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2017-07-14
    • 2016-04-19
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    相关资源
    最近更新 更多