zoukankan      html  css  js  c++  java
  • Swift使用AlamoFire超时设置和事件处理

      一直在写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: "网络连接错误!
    请检查网络后再试")
        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: "网络连接超时!
    请检查网络后再试")
        }
        completionHandler(nil, .NET_FAIL)
        return
    }

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

      

  • 相关阅读:
    行转列函数listagg() WITHIN GROUP ()
    位图索引
    windows 杀掉进程
    vue 实践(过滤器)
    vue 总结
    vue v-show v-if 的使用
    vue v-for 绑定数据
    vue v-model实现数据的双向绑定
    vue .stop .self .capture .prevent 阻止冒泡
    vue v-on v-text 的运用
  • 原文地址:https://www.cnblogs.com/rion1234567/p/10564807.html
Copyright © 2011-2022 走看看