Swift 4 - Alamofire - 如何根据请求禁用缓存

Posted

技术标签:

【中文标题】Swift 4 - Alamofire - 如何根据请求禁用缓存【英文标题】:Swift 4 - Alamofire - How to disable cache on request 【发布时间】: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)

                

            

    

但这没有用,结果相同。

【问题讨论】:

【参考方案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 请求错误是:已取消 是的,无论我做什么,它都失败了。

以上是关于Swift 4 - Alamofire - 如何根据请求禁用缓存的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 - Alamofire - 如何根据请求禁用缓存

如何在 Alamofire 4 和 Swift 3 中设置方法、标题、参数

如何使用参数 swift 3.0 Alamofire 4.0 调用邮政服务?

Swift 4:如何使用 Alamofire 在参数中发布文件?

如何使用 Alamofire,Swift 4 为 UICollectionView 获取 JSON 数据

Alamofire 4 请求返回 NSArray,无法弄清楚如何在 Swift 3 中使用 SwiftyJSON 进行解析