文档章节

Swift使用AlamoFire超时设置和事件处理

o
 osc_y8yehimr
发布于 2019/03/20 14:37
字数 712
阅读 10
收藏 0

精选30+云产品,助力企业轻松上云!>>>

  一直在写swift项目,正好碰到服务器部署,请求超时或者请求失败的问题,页面就卡着不动了。顺手解决一下吧

  差了些资料,说要设置超时时间

 

  方法一

1 static let sharedSessionManager: Alamofire.SessionManager = {
2     let configuration = URLSessionConfiguration.default
3     configuration.timeoutIntervalForRequest = 6
4     return Alamofire.SessionManager(configuration: configuration)
5 }()

  然后发送请求的时候,不用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 = 6
let postString = "param1=\(value1)&param2=\(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
}

  自此,解决超时时间设置和处理超时事件。

  

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

物联网开发服务开发虚拟设备需要几步?

云栖号快速入门:【点击查看更多云产品快速入门】 不知道怎么入门?这里分分钟解决新手入门等基础问题,可快速完成产品配置操作! 物联网平台设备的正常开发流程是:设备端开发完成,设备上报...

osc_2axit9df
30分钟前
18
0
互联网互联网必看文章墙裂推荐

后端必看文章系列 大型项目架构演进过程及思考的点

code-ortaerc
31分钟前
20
0
ACL2020论文整理 - 知乎

ACL2020录取文章已经放出,链接如下: ACL2020论文集合 www.aclweb.org 为了以后更加方便地阅读论文,也本着一颗开源之心,花一个下午的时间整理了一下相关论文。鉴于本人精力有限,并且也只...

osc_5w65ebjo
31分钟前
10
0
SU(N) Hubbard 模型平均场

osc_31d5oo2i
33分钟前
18
0
Python语言及其应用PDF高清完整版百度云盘免费下载|python基础教程PDF电子书推荐

编辑推荐 本书内容易于理解,而且读起来生动有趣,是编程和Python初学者不可多得的教程。书中首先介绍了Python的基础知识,然后逐渐深入多种主题,结合教程和攻略式风格来讲解Python 3中的概...

osc_nbg2lo7i
34分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部