NSURLRequest的超时陷阱
最近被报了个问题,说我们的模块在网络情况不佳的时候,接口访问经常在那儿等待,不会超时!
第一反应去查了代码里头设置的超时时间,发现设置的是30s,但是从表现来看,确实超时时间远超30s,经常一两分钟才超时,甚至更久。也就是说,我明明设置了NSURLRequest(NSURLConnection)的超时时间,但是他却没有超时返回!超时参数timeoutInterval没有生效!
开始怀疑系统的问题,于是上网查,终于在StackOverFlow上有人提到说iPhone的超时时间是4分钟;继续查找,发现有人提到,在iPhone上,仅仅当你使用POST方式的时候,系统的最小超时时间会是240s。
(2012-10-30编辑补充:该问题在ios6上已得到修正,不在是最小240s了)
所以做了个试验:
- NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];
- NSLog(@"default time out %f(GET)", request.timeoutInterval);
- request.timeoutInterval = 10;
- NSLog(@"custom time out %f(GET)", request.timeoutInterval);
- [request setHTTPMethod:@"POST"];
- NSLog(@"time out %f(POST NO DATA)", request.timeoutInterval);
- [request setValue:@"application/octet-stream" forHTTPHeaderField: @"Content-Type"];
- NSData *data = [@"hello" dataUsingEncoding:NSUTF8StringEncoding];
- NSString *postLength = [NSString stringWithFormat:@"%d", [data length]];
- [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
- [request setHTTPBody:data];
- NSLog(@"time out %f(POST WITH DATA)", request.timeoutInterval);
- request.timeoutInterval = 10;
- NSLog(@"time out %f(POST WITH DATA)", request.timeoutInterval);
- request.timeoutInterval = 250;
- NSLog(@"time out %f(POST WITH DATA)", request.timeoutInterval);
运行结果输出如图:
- 2011-12-22 16:36:49.681 Untitled[2474:207] default time out 60.000000(GET)
- 2011-12-22 16:36:49.683 Untitled[2474:207] custom time out 10.000000(GET)
- 2011-12-22 16:36:49.684 Untitled[2474:207] time out 10.000000(POST NO DATA)
- 2011-12-22 16:36:49.684 Untitled[2474:207] time out 240.000000(POST WITH DATA)
- 2011-12-22 16:36:49.685 Untitled[2474:207] time out 240.000000(POST WITH DATA)
- 2011-12-22 16:36:49.686 Untitled[2474:207] time out 250.000000(POST WITH DATA)
证实,确实在使用POST并且带有数据的情况下NSURLRequest的超时时间最短是240s!所以遇到NSURLRequest超时不返回的时候,不要再被吓到了。
说实话,还是觉得很无奈,不过据说苹果这么做的原因是,考虑到iPhone从睡眠唤醒的时候,网络的唤醒需要时间,所以做了这个设置。这个我可以理解,但是为什么不把这个写在文档里头呢!让我在被质问的时候很无语。。。
转载于:https://blog.51cto.com/kensou/748691
NSURLRequest的超时陷阱相关推荐
- 都在说微服务,那么微服务的反模式和陷阱是什么(三)
前文导读: <都在说微服务,那么微服务的反模式和陷阱是什么(一)> <都在说微服务,那么微服务的反模式和陷阱是什么(二)> 九.通信协议使用的陷阱 在微服务架构体系中要求每个服 ...
- 都在说微服务,那么微服务的反模式和陷阱是什么(一)
译者:程超 译文:http://www.jianshu.com/p/3986239138fe 中文目录 1.数据驱动的迁移反模式 1.1.太多的数据迁移 1.2.功能分割优先,数据迁移最后 2.超时反 ...
- java runtime.exec 阻塞_关于Runtime.getRuntime().exec()产生阻塞的2个陷阱
背景 相信做java服务端开发的童鞋,经常会遇到Java应用调用外部命令启动一些新进程来执行一些操作的场景,这时候就会使用到Runtime.getRuntime().exec(),然而这个方法如果不谨 ...
- java runtime shell_java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现...
Runtime.getRuntime().exec()执行JVM之外的程序:常见的几种陷阱 前言 日常java开发中,有时需要通过java运行其它应用功程序,比如shell命令等.jdk的Runtim ...
- Python教程: 闭包及陷阱
Python语言是支持函数式编程的,我们可以在一个函数的函数体中定义另一个完整的函数,甚至返回这个函数.在函数内部定义的函数和外部定义的函数是相同的,唯一的区别就是在函数内部定义的函数是不能被外部访问 ...
- java try catch陷阱_Java异常处理最佳实践及陷阱防范
原标题:Java异常处理最佳实践及陷阱防范 出自<深夜里的程序猿> 作者:wangzenghuang 前言 不管在我们的工作还是生活中,总会出现各种"错误",各种突发的 ...
- 写给大数据从业者:数据科学的5个陷阱与缺陷
来源 | AI 前线 作者 | 陈炬,责编 | Carol 出品 | CSDN云计算(ID:CSDNcloud) 导读: 这篇分享主要总结了数据从业人员在实践中可能遇到的陷阱与缺陷.跟其他新起的行业一 ...
- 手动抛出异常_Java异常处理最佳实践及陷阱防范
前言 不管在我们的工作还是生活中,总会出现各种"错误",各种突发的"异常".无论我们做了多少准备,多少测试,这些异常总会在某个时间点出现,如果处理不当或是不及时 ...
- 微服务设计 10 大反模式和陷阱
数据驱动迁移反模式(Data-Driven Migration) 如上图所示,此种反模式的问题在于微服务的粒度没有最终确定之前就做了数据迁移,如此当不断的调整服务粒度时,那么数据库就免不了频繁迁移 ...
最新文章
- JavaScript初学者编程题(12)
- linux 内核可装载模块 版本检查机制
- TCP/IP详解 笔记八
- 内存泄漏–测量频率和严重性
- Angular 自定义属性指令-禁止input框输入空格-以及删除复制内容中的空格
- 计算机虚拟现实技术论文好写吗,虚拟现实技术的论文
- Percona XtraBackup 数据恢复工具安装 ubuntu 16.04
- python 基本数据类型之set
- python计算工资编程-Python工程师薪水居然这么高
- 关于 pip安装的可能错误的排除
- poj 3450 Corporate Identity 枚举+kmp,话说这家伙给我一顿超时啊!!!!
- CocoStudio 的使用
- Visio2019安装
- 国家区域代码关系整理
- 小米手机计算机usb连接,小米5手机怎么连接电脑 USB调试方法教程
- c语言使用反三角函数,C语言中反三角函数怎样调用?
- 浅谈一万小时定律的表与里
- 【Babylon小技巧04】进阶双开门事件绑定同时触发
- 开源电子表格Luckysheet强势推出在线协作
- 提现业务流程介绍与设计