Swift使用AlamoFire超时设置和事件处理
一直在写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)¶m2=\(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超时设置和事件处理的更多相关文章
- delphi tidhttp 超时设置无效的解决方法
现在delphi都发布到xe8了,tidhttp还有缺陷,那就是超时设置在没有网络或者连不上服务器的时候是无效的,不管你设置为多少都要10-20秒.connectTimeout和readTimeout ...
- Linux串口中的超时设置
在Linux下使用串口通信时,默认的阻塞模式是不实用的.而采用select或epoll机制的非阻塞模式,写代码有比较麻烦.幸好Linux的串口自己就带有超时机制. Linux下使用termios.h中 ...
- org.apache.http.client.HttpClient; HttpClient 4.3超时设置
可用的code import org.apache.commons.lang.StringUtils;import org.apache.http.HttpEntity;import org.apac ...
- HttpClient 3.X 4.3 4.x超时设置
HttpClient 4.3.HttpClient这货和Lucene一样,每个版本的API都变化很大,这有点让人头疼.就好比创建一个HttpClient对象吧,每一个版本的都不一样, 3.X是这样的 ...
- Apache性能优化、超时设置,linux 重启apache
在httpd.conf中去掉Include conf/extra/httpd-default.conf前的#以使httpd-default.php生效.其中调节以下参数Timeout 15 (连接超时 ...
- libcurl多线程超时设置不安全(转)
from http://www.cnblogs.com/kex1n/p/4135263.html (1), 超时(timeout) libcurl 是 一个很不错的库,支持http,ftp等很多的协议 ...
- CXF超时设置
转自: http://peak.iteye.com/blog/1285211 http://win.sy.blog.163.com/blog/static/9419718620131014385644 ...
- 使用select io复用实现超时设置
在linux的socket编程中,经常会遇到超时设置的问题,例如请求方如果在Ks内不发送数据则服务器要断开连接停止服务.这里我使用select的io复用实现超时5s设置,具体代码片段如下: fd_se ...
- jquery ajax超时设置
var ajaxTimeoutTest = $.ajax({ url:'', //请求的URL timeout : 1000, //超时时间设置,单位毫秒 type : 'get', //请求方式 ...
随机推荐
- 高性能JavaScript(加载和执行)
当浏览器遇到 <script> 标签时,它是没办法知道 JavaScript 是否会向DOM中添加内容或引入其他元素,甚至关闭某一个标签.因此这个时候浏览器就会停止处理页面,先执行Java ...
- JS--我发现,原来你是这样的JS(引用类型不简单[上篇],且听我娓娓道来)
一.介绍 没错,这是第五篇,到了引用类型,这次要分成两次博文了,太多内容了,这是前篇,篇幅很长也很多代码,主要讲引用类型和常用的引用类型,代码试验过的,老铁没毛病. 坚持看坚持写,不容易不容易,希望大 ...
- 在JavaScript文件中用ajax方法实现省市区的三级联动
1.JavaScript Document $(document).ready(function(e) { 加载三个下拉列表 $("#sanji").html("< ...
- PDO预处理语句
1.造PDO对象$dsn = "mysql:dbname=mydb;host=localhost";$pdo = new PDO($dsn,"root",&qu ...
- as 打包报错
错误:Android Error:Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease' ...
- 本地用maven搭建SpringMvc+redis集成
---恢复内容开始--- 首先本地需要搭建私服,简单说一下搭建私服的步骤 1.为什么使用Nexus 如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地,而 ...
- 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础
---layout: posttitle: 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础key: 20180203tags: 机器学习 ML IRIS python3mo ...
- git 命令行下浏览器tig使用记录
git 命令行下浏览器tig使用记录 tig 是一款优化 git 命令行的工具,使 git 命令行更加的便捷人性化 .如果用习惯了,会上瘾. 以下是一些使用记录: 安装成功后,在 Repo 文件夹下, ...
- Mysql引擎innodb_pool的作用
innodb_buffer_pool的简介: InnoDB主索引是聚簇索引,索引与数据共用表空间,对于InnoDB而言,数据就是索引,索引就是数据.InnoDB缓存机制和MyISAM缓存机制的最大区别 ...
- csrf在web网站中有多重要
小弟是学python的,今天在上网时看到一个商城网站,正好昨天学到了CSRF跨站请求,就对这个商城网站进行了一波测试 可以看到网页布局做的还是很不错的,然后进入了注册页面看看 之后就开始测试了 正常请 ...