Swift使用AlamoFire超时设置和事件处理
一直在写swift项目,正好碰到服务器部署,请求超时或者请求失败的问题,页面就卡着不动了。顺手解决一下吧
差了些资料,说要设置超时时间
方法一:
static let sharedSessionManager: Alamofire.SessionManager = {
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest =
return Alamofire.SessionManager(configuration: configuration)
}()
然后发送请求的时候,不用Alamofire.request 直接 sharedSessionManager.request
方法二:
在方法一设置超时时间不管用时,使用NSURLRequest的方法,调用Alamofire.request这个API
var request = URLRequest(url: NSURL.init(string: "url")! as URL)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.timeoutInterval =
let postString = "param1=\(value1)¶m2=\(value2)"
request.httpBody = postString.data(using: .utf8)
Alamofire.request(request).responseJSON {
response in
}
这里说一下 timeoutInterval timeoutIntervalForResource timeoutIntervalForRequest 的区别
这三个值均可以触发请求超时
使用方法一,就会以timeoutIntervalForRequest和timeoutIntervalForResource中较小值为超时时间,覆盖timeoutInterval默认的60秒
使用方法二,NSURLRequest来直接设置timeoutinterval,会忽略timeoutIntervalForRequest的设置,以timeoutIntervalForResource和timeoutInterval中较小值为超时时间
使用background session模式来进行上传下载,会忽略掉timeoutIntervalForRequest和timeoutInterval的设置,而使用timeoutIntervalForResource作为超时时间
NSURLRequest:
timeoutInterval - 默认60s
SessionConfiguration:
timeoutIntervalForRequest - 默认60s
timeoutIntervalForResource - 默认7天
OK,功能实现了,请求6秒钟后出来报错。
2019-03-20 13:58:03.320254+0800 Booster[5902:424495] Task <5B28B0F9-D482-4DB6-B2FC-3B132972956E>.<1> load failed with error Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=-2102, NSUnderlyingError=0x600000680b40 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalUploadTask <5B28B0F9-D482-4DB6-B2FC-3B132972956E>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalUploadTask <5B28B0F9-D482-4DB6-B2FC-3B132972956E>.<1>"
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=http://***.***.***.***/api.php, NSErrorFailingURLKey=http://**.***.***.***/api.php, _kCFStreamErrorDomainKey=4} [-1001]
2019-03-20 13:58:03.321807+0800 Booster[5902:424492] Task <5B28B0F9-D482-4DB6-B2FC-3B132972956E>.<1> HTTP load failed (error code: -999 [1:89])
但是我们怎么去处理这些报错呢?如何拿到这些报错信息,然后在页面提示 请求超时 之类的反馈呢?
Alamofire在请求时,response.result会有.success和.failure两种状态,网上很多人就直接将错误处理放在了failure中获取
case .failure(let error):
if error._code == NSURLErrorTimedOut {
//handle timeout here
print("time out")
}
//提示网络错误
showError(status: "网络连接错误!\n请检查网络后再试")
completionHandler(nil, .NET_FAIL)
break
可能这样处理在request的API中管用,但在Alamofire.upload()时,是无法捕获的,因为始终都走了.success
后来翻阅了各种issue和stackoverflow,并没有这方面的解答。还是自己一步一步顺着试试吧。
于是想到,既然请求都是success,那就是在success的参数里面找方法,UploadRequest是没有error方法,那就再往下找,就发现了
upload.responseJSON { res in
print(res.error)
}
那就在此添加判断逻辑吧
guard res.error == nil else {
if res.error!._code == NSURLErrorTimedOut {
//handle timeout here
print("time out")
//提示网络错误
showError(status: "网络连接超时!\n请检查网络后再试")
}
completionHandler(nil, .NET_FAIL)
return
}
自此,解决超时时间设置和处理超时事件。
最新文章
- Yii2的urlManager URL美化
- JQuery_DOM 节点操作之创建节点、插入节点
- C++中的异常处理机制
- Jstl简单应用
- IOS开发札记
- 去掉iPhone、iPad的默认按钮样式 去掉高光样式:
- Linux基础: 一切都是文件
- Java中常见几种数据库连接方法
- jquery ui 插件------------------------->;sortable
- 【Git】Git教程
- 07 - 删除vtkDataObject中的SetExtentTranslator 和 GetExtentTranslator方法 VTK 6.0 迁移
- 棋盘覆盖(大数阶乘,大数相除 + java)
- SQL中去除某字段中的某个字符语法
- MySQL show binglog event in &#39;log_name&#39;
- foreach底层机制
- java访问修饰符 public protect default private
- TP5模型类关键字赋值
- 前端paging分页,前端设置每页多少条和当前页面的索引,传给后端,数据显示出来
- weblogic安装教程(以weblogic 11g为例)
- UI设计教程分享:banner设计
热门文章
- x64系统WSC注册方法
- webpack打包vue项目之后生成的dist文件该怎么启动运行
- MVC与单元测试实践之健身网站(一)-项目概述
- plsql 导出查询结果
- Flex自动回收导致监听不到ModuleEvent.READY事件
- nginx 配置 非80 的其他 端口
- springcloud 入门 5 (feign源码分析)
- 在 Azure Resource Manager 中为虚拟机设置密钥保管库
- 转:总结const、readonly、static三者的区别
- C++设计模式 ==>; 装饰(者)模式