我如何检查 Alamofire 我的请求已发送?
Posted
技术标签:
【中文标题】我如何检查 Alamofire 我的请求已发送?【英文标题】:How could I check in Alamofire my request is sent? 【发布时间】:2018-10-08 09:50:21 【问题描述】:无论是否收到响应,使用 Alamofire 都可以在发送请求时获取事件?就像这个 URLSession 方法一样:
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didSendBodyData:(int64_t)bytesSent
totalBytesSent:(int64_t)totalBytesSent
totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend;
编辑: 我的代码是将 JSON 发送到服务器:
Alamofire.request("http://...", method: HTTPMethod.post, parameters: params, encoding: JSONEncoding.default,
headers: [...]).responseJSON
response in
if response.result.isSuccess
print("result is Success")
else
print("result is Failure")
我想处理如果网络断开了怎么办,我想知道响应是否到达。
提前感谢您提供的任何帮助。
【问题讨论】:
【参考方案1】:响应验证
默认情况下,无论响应的内容如何,Alamofire 都会将任何已完成的请求视为成功。如果响应具有不可接受的状态代码或 MIME 类型,则在响应处理程序之前调用 validate
会导致生成错误。
手动验证
Alamofire.request("https://httpbin.org/get")
.validate(statusCode: 200..<300)
.validate(contentType: ["application/json"])
.responseData response in
switch response.result
case .success:
print("Validation Successful")
case .failure(let error):
print(error)
自动验证
自动验证200..<300
范围内的状态码,并且响应的Content-Type
标头与请求的Accept
标头匹配(如果提供了)。
Alamofire.request("https://httpbin.org/get").validate().responseJSON response in
switch response.result
case .success:
print("Validation Successful")
case .failure(let error):
print(error)
统计指标
时间线
Alamofire 在 Request
的整个生命周期中收集计时,并创建一个 Timeline
对象,作为所有响应类型的属性公开。
Alamofire.request("https://httpbin.org/get").responseJSON response in
print(response.timeline)
以上报告如下Timeline
信息:
Latency
:0.428 秒
Request Duration
:0.428 秒
Serialization Duration
:0.001 秒
Total Duration
:0.429 秒
取自Alamofire Usage。你可以有更深入的了解。
【讨论】:
我试图澄清我的问题。对不起,如果我不清楚。 如果请求失败或没有连接请求将失败,在case .failure
你会发现错误是什么。【参考方案2】:
您可以只使用标准闭包,它会给您一个响应。无论响应是否为错误,都会调用此闭包。如果您想检查上传进度,它也可以这样做
Alamofire.download("https://httpbin.org/image/png")
.downloadProgress progress in // progress
print("Download Progress: \(progress.fractionCompleted)")
.responseData response in // usual place to get response
if let data = response.result.value
let image = UIImage(data: data)
阅读Making a request documentation了解更多信息
【讨论】:
我试图澄清我的问题。对不起,如果我不清楚。 如果没有网络,则请求将失败,您可能会收到无连接错误或超时错误以上是关于我如何检查 Alamofire 我的请求已发送?的主要内容,如果未能解决你的问题,请参考以下文章