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 进行解析