一直在写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)&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
}

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

  


Swift使用AlamoFire超时设置和事件处理的更多相关文章

  1. delphi tidhttp 超时设置无效的解决方法

    现在delphi都发布到xe8了,tidhttp还有缺陷,那就是超时设置在没有网络或者连不上服务器的时候是无效的,不管你设置为多少都要10-20秒.connectTimeout和readTimeout ...

  2. Linux串口中的超时设置

    在Linux下使用串口通信时,默认的阻塞模式是不实用的.而采用select或epoll机制的非阻塞模式,写代码有比较麻烦.幸好Linux的串口自己就带有超时机制. Linux下使用termios.h中 ...

  3. org.apache.http.client.HttpClient; HttpClient 4.3超时设置

    可用的code import org.apache.commons.lang.StringUtils;import org.apache.http.HttpEntity;import org.apac ...

  4. HttpClient 3.X 4.3 4.x超时设置

    HttpClient 4.3.HttpClient这货和Lucene一样,每个版本的API都变化很大,这有点让人头疼.就好比创建一个HttpClient对象吧,每一个版本的都不一样, 3.X是这样的 ...

  5. Apache性能优化、超时设置,linux 重启apache

    在httpd.conf中去掉Include conf/extra/httpd-default.conf前的#以使httpd-default.php生效.其中调节以下参数Timeout 15 (连接超时 ...

  6. libcurl多线程超时设置不安全(转)

    from http://www.cnblogs.com/kex1n/p/4135263.html (1), 超时(timeout) libcurl 是 一个很不错的库,支持http,ftp等很多的协议 ...

  7. CXF超时设置

    转自: http://peak.iteye.com/blog/1285211 http://win.sy.blog.163.com/blog/static/9419718620131014385644 ...

  8. 使用select io复用实现超时设置

    在linux的socket编程中,经常会遇到超时设置的问题,例如请求方如果在Ks内不发送数据则服务器要断开连接停止服务.这里我使用select的io复用实现超时5s设置,具体代码片段如下: fd_se ...

  9. jquery ajax超时设置

    var ajaxTimeoutTest = $.ajax({ url:'',  //请求的URL timeout : 1000, //超时时间设置,单位毫秒 type : 'get',  //请求方式 ...

随机推荐

  1. 从零开始学习html(十)CSS格式化排版——下

    六.文字排版--删除线 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type&q ...

  2. framework7中a标签没反应

    试试在a标签上加这个样式: class="external"

  3. css 常用的几种垂直居中(包括图片)

    我知道现在有非常多的水平垂直居中的写法,我就写一些我自己常用的方法,同时说明一下优缺点 <div class="wrapper"> <div class=&quo ...

  4. Android - Android Studio 解决访问被墙的问题

    socks代理配置 项目代理:根目录下的gradle.properties文件 org.gradle.jvmargs=-DsocksProxyHost= 2.全局代理:用户根目录下的.gradle\g ...

  5. JQuery判断数组中是否包含某个字符串

    var arry = [ "C#", "html", "css", "JavaScript" ]; var result ...

  6. iOS 开发多线程 —— NSOperation

    本文是根据文顶顶老师的博客学习而来,转载地址:http://www.cnblogs.com/wendingding/p/3809042.html 一.NSOperation简介 1.简单说明 NSOp ...

  7. [iOS] UICollectionView初始化滚动到中间的bug

    转载请保留地址wossoneri.com 问题 首先看一下我之前写的demo:link demo是封装了一个控件,直接在MainViewController的viewWillAppear里初始化,并且 ...

  8. Oracle EBS 银行账户API

     创建银行 -- Create Bank DECLARE p_init_msg_list VARCHAR2(200); p_country_code VARCHAR2(200); p_bank_nam ...

  9. [Visual Studio] [Config] [Transformation] [SlowCheetah] 在非Web工程中使用Transformation

    1. 为VS安装SlowCheetah插件 https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.Sl ...

  10. python之绘制图形库turtle

    关于绘制图形库turtle# 画布上,默认有一个坐标原点为画布中心的坐标轴(0,0),默认"standard"模式坐标原点上有一只面朝x轴正方向小乌龟 一:海龟箭头Turtle相关 ...