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: "網絡連接錯誤!\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
}

  自此,解決超時時間設置和處理超時事件。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM