NSURLConnection超时大坑
NSMutableURLRequest *urlRequest = [[ NSMutableURLRequestalloc ] initWithURL:url cachePolicy: NSURLRequestUseProtocolCachePolicytimeoutInterval :10];
NSURLConnection *_connection = [[ NSURLConnectionalloc ] initWithRequest:urlRequest delegate:selfstartImmediately: YES ];
|
一个用来创建请求,一个用来将请求发送出去。然后我们实现 NSUrlConnectionDelegate 的几个回调函数就能完成整个流程了。
一般发送网络请求都会去设置一个超时时间,防止请求在那一直等待。根据不同的场景,我们还需要设置不同的超时时间。在上面的代码中我们设置了10秒超时。
上面的故事看起来很完美。但是 apple的开发人员在这里给我们挖了一个坑。
如果你的请求是个简单的“Get”请求,或者木有 body的“post”请求。一切都是那么完美,请求能够按照我们设定的时间自动超时。但是如果你发的是个“POST”请求,并且[urlRequest setHTTPBody:httpBody]; 那么,不好意思,你被潜规则了。
ios3.0 以后 苹果的sdk对这种情况做了调整,如果是post请求,并且设置了 httpBody,那么请求的超时时间就被默认设置为 240 秒了。就算你再使用[urlRequest setTimeoutInterval:10];也是无效的,我们可以再设置完成后再读取这个值,发现它不会变成10,依然保持240秒。于是乎,网络不稳定的时候,你的程序就可能会陷入漫长的等待。
发现这个问题后。我们通过自己起timer的方式来控制超时。具体怎么弄这里就不细说。只说下我们的策略。
我们将整个网络过程分为 链接建立,发送数据,数据发送完成等待回包,接收数据 4个阶段来控制具体的超时。
设置我们的标准超时时间为 N (系统默认为 10秒,网络模块通过暴露相关接口,调用方可自由设置)
链接建立链接超时时间: N * 1.5
每数据包发送超时时间: N * 1.5
数据发送完成等带回包超时: N * 2
每数据包接收超时时间: N * 1
以上超时分别在 NSUrlConnectionDelegate 的各个回调阶段进行相关设置就能达到比较精细的控制。
特别说明下,为什么数据发送完成后等待回包的超时会设置的比较长。因为在实际测试过程中发现发包完成到接收到第一个数据包比较耗时,一般httpbody越大越明显,初步猜测是网络模块在发送数据缓冲区的数据,所以这里做了特殊的控制。
哦了。罗嗦了半天,终于说完了。希望能对大家有帮助。能跳过这个坑。
NSURLConnection超时大坑相关推荐
- leetcode327 超时大坑
这题使用把两个赋值 for (int i = st; i <= mid; i++){int m = mid;int n = mid;while (m <= ed && su ...
- app 常见网络性能
常见的网络性能问题有如下几种: 问题一:DNS问题 DNS出问题的概率其实比大家感觉的要大,首先是DNS被劫持或者失效,2015年初业内比较知名的就有Apple内部DNS问题导致App Store ...
- iOS开发网络篇—NSURLConnection基本使用
一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法.请求头.请求体.... ...
- NSURLRequest的超时陷阱
最近被报了个问题,说我们的模块在网络情况不佳的时候,接口访问经常在那儿等待,不会超时! 第一反应去查了代码里头设置的超时时间,发现设置的是30s,但是从表现来看,确实超时时间远超30s,经常一两分钟才 ...
- iOS开发网络篇—NSURLConnection基本使用(一)
一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法.请求头.请求体.. ...
- iOS网络开发之:NSURLConnection
今天开始打算总结一下在iOS开发中的网络部分 NSURLConnection 这个访问网络的方式最简单,但功能也是最少的因此只有很简单的网络访问才会用到; 使用NSURLConnection访问网络大 ...
- Okhttp 使用与debug时留的大坑
Okhttp简单辅助类与debug注意事项 先贴代码(代码不全,仅供参考) import android.os.Handler; import android.os.Looper; import an ...
- HttpClient 如何设置超时时间
今天分享一个巨坑,就是 HttpClient.这玩意有多坑呢?就是每个版本都变,近日笔者深受其害. 先看一下代码,我要发送请求调用一个c++接口. public static String doPos ...
- iOS-----使用NSURLConnection
使用NSURLConnection 如果只是为了读取HTTP等服务器数据,或向服务器提交数据,iOS还提供了NSURLConnection类,NSURLConnection使用NSURLRequest ...
最新文章
- 第六十二课、单例类模板
- python常用内置模块-Python基础-22常用内置模块
- git 修改本地用户名_git简单介绍
- 【jQuery系列之插件】jQuery插件---exselect实现联动
- 2021牛客暑期多校训练营3 I Kuriyama Mirai and Exclusive Or 差分 + 二进制分治
- 10个工程师,9个不合格!!
- CentOS 7安装mysql
- [置顶] Responder一点也不神秘————iOS用户响应者链完全剖析
- Hadoop之MapReduce理论篇01
- 【渝粤教育】国家开放大学2018年春季 0692-22T化工设备机械基础 参考试题
- 解决MacOS 下载的文件名字乱码问题
- 恒压板框过滤实验数据处理_中学少见、高考常考的化学实验仪器
- 【原创】docker在Ubuntu下1小时快速学习
- 一文扫尽检测类评估指标:AP、mAP、ReCall、OKS和IoU
- Python中sys模块
- 手机上照片大小怎么改?如何用手机修改图片尺寸?
- qq空间播放器肤代码
- 目标跟踪: 卫星捕获
- 台式电脑耳机有杂音并且音量小解决
- 输入年和月份,输出这一年该月份有多少天。