NSURLConnection 网络超时的那些事(转别人整理的)
NSURLConnection 网络超时的那些事(转别人整理的)
在ios平台上做网络开发最常用的两个类:
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 网络超时的那些事(转别人整理的)的更多相关文章
- Charles模拟网络请求页面的网络超时测试
正常情况下网络连接超时可能的原因有以下几点: 1.网络断开,手动的关掉了网络的连接 2.网络阻塞,导致你不能在程序默认等待时间内得到回复数据包. 3.网络不稳定,网络无法完整传送服务器信息. 4.系统 ...
- pip安装拓展包--网络超时/Read timed out问题
pip安装拓展包--网络超时/Read timed out问题 解决方案:切换镜像源(墙皮太厚) 在后面加上: -i https://pypi.douban.com/simple example: p ...
- (转)HttpURLConnection中设置网络超时
转:http://www.xd-tech.com.cn/blog/article.asp?id=37 Java中可以使用HttpURLConnection来请求WEB资源.HttpURLConnect ...
- 网络爬虫技术实现java依赖库整理输出
网络爬虫技术实现java依赖库整理输出 目录 1 简介... 2 1.1 背景介绍... 2 1.2 现有方法优缺点对比... 2 2 实现方法... 2 ...
- iOS - NSURLConnection 网络请求
前言 @interface NSURLConnection : NSObject class NSURLConnection : NSObject DEPRECATED: The NSURLConne ...
- NSURLConnection 网络请求
前言 DEPRECATED: The NSURLConnection class should no longer be used. NSURLSession is the replacement f ...
- [转]网络时间的那些事及 ntpq 详解
Gentoo(也许其他发行版也是?)中 "ntpq -p" 的 man page 只有简短的描述:“打印出该服务器已知的节点列表和它们的状态概要信息.” 我还没见到关于这个命令的说 ...
- 关于AFNetworking访问网络超时的设置
前言:有的猿会发现在设置AFNetworking访问网络超时时,直接用self.manager.requestSerializer.timeoutInterval =10.f不起作用. 解决办法:经过 ...
- 爬虫中网络请求的那些事之urllib库
目录 爬虫之网络请求中的那些事 urllib库 urlopen函数 urlretrieve函数 urlencode.parse_qs函数 urlparse.urlsplit函数: request.Re ...
随机推荐
- Rdlc报表出现空白页解决方法
在使用RDLC报表时,碰到这种情况:当只有一页数据时,报表确显示两页,第二页除了报表头之外数据为空.然后,当有多页数据时,最后一页为空. RDLC報表設計好後,在ReportViewer預覽報表時,頁 ...
- $watch How the $apply Runs a $digest
作者:junyuecao | 发表于 8-8 13:39 | 最后更新时间:8-9 02:34 原文地址:http://angular-tips.com/blog/2013/08/watch-how- ...
- UVALive 5880 Vigenère Cipher Encryption (模拟)
Stack Machine Executor 题目链接: http://acm.hust.edu.cn/vjudge/problem/26628 Description http://7xjob4.c ...
- Oracle中INT、FLOAT、NUMBER区别
Oracle里的int等于number(长度,0) float也类似,number要定义小数部分的位数,而float不用定义后边小数有几位 因为NUMBER要确定长度,后边确定小数位. 所以,如果不 ...
- Connecting Physics Bodies
[Connecting Physics Bodies] The kinds of joints you can create in Sprite Kit. You add or remove join ...
- JavaScript面向对象简介
JavaScript面向对象简介 @(编程) [TOC] 1. 命名空间 命名空间是一个容器,它允许开发人员在一个独特的,特定于应用程序的名称下捆绑所有的功能. 在JavaScript中,命名空间只是 ...
- Session和Cookie的分析与区别
首先说一下Web.config文件中的cookieless="false"的理解 cookieless="false"表示: 如果用户浏览器支持cookie时启 ...
- HDU 5489 Removed Interval (LIS变形)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5489 给你n个数,要删去其中连续的L个,问你删去之后的LIS最大是多少? 我们先预处理出以i下标为开头 ...
- A - Oulipo
A - Oulipo Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit S ...
- poj 1941 The Sierpinski Fractal 递归
//poj 1941 //sep9 #include <iostream> using namespace std; const int maxW=2048; const int maxH ...