经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Swift » 查看文章
Swift使用AlamoFire超时设置和事件处理
来源:cnblogs  作者:大禹不治水  时间:2019/3/21 9:23:34  对本文有异议

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

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

 

  方法一

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

  然后发送请求的时候,不用Alamofire.request 直接 sharedSessionManager.request

 

  方法二

  在方法一设置超时时间不管用时,使用NSURLRequest的方法,调用Alamofire.request这个API

  1. var request = URLRequest(url: NSURL.init(string: "url")! as URL)
  2. request.httpMethod = "POST"
  3. request.setValue("application/json", forHTTPHeaderField: "Content-Type")
  4. request.timeoutInterval = 6
  5. let postString = "param1=\(value1)&param2=\(value2)"
  6. request.httpBody = postString.data(using: .utf8)
  7. Alamofire.request(request).responseJSON {
  8. 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秒钟后出来报错。

  1. 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=(
  2. "LocalUploadTask <5B28B0F9-D482-4DB6-B2FC-3B132972956E>.<1>"
  3. ), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=http://123.176.102.27/lobby/api.php, NSErrorFailingURLKey=http://123.176.102.27/lobby/api.php, _kCFStreamErrorDomainKey=4} [-1001]
  4. 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中获取

  

  1. case .failure(let error):
  2. if error._code == NSURLErrorTimedOut {
  3. //handle timeout here
  4. print("time out")
  5. }
  6. //提示网络错误
  7. showError(status: "网络连接错误!\n请检查网络后再试")
  8. completionHandler(nil, .NET_FAIL)
  9. break

 

  可能这样处理在request的API中管用,但在Alamofire.upload()时,是无法捕获的,因为始终都走了.success

  后来翻阅了各种issue和stackoverflow,并没有这方面的解答。还是自己一步一步顺着试试吧。

  于是想到,既然请求都是success,那就是在success的参数里面找方法,UploadRequest是没有error方法,那就再往下找,就发现了

  1. upload.responseJSON { res in
  2. print(res.error)
  3. }

  那就在此添加判断逻辑吧

 

  1. guard res.error == nil else {
  2. if res.error!._code == NSURLErrorTimedOut {
  3. //handle timeout here
  4. print("time out")
  5. //提示网络错误
  6. showError(status: "网络连接超时!\n请检查网络后再试")
  7. }
  8. completionHandler(nil, .NET_FAIL)
  9. return
  10. }

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

  

 

原文链接:http://www.cnblogs.com/rion1234567/p/10564807.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号