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) 如上图所示,此种反模式的问题在于微服务的粒度没有最终确定之前就做了数据迁移,如此当不断的调整服务粒度时,那么数据库就免不了频繁迁移 ...
最新文章
- MinkowskiEngine Miscellaneous Classes杂类
- 后台接口向数据库录入汉字时乱码以及自动过滤文字经验总结
- 2018年第九届省赛C/C++A组第2题——星期一
- Android之访问网络,使用HttpURLConnection还是HttpClient?
- javascript内存泄漏调试工具mac_Vuex3.1.1更新:支持jsDelivr,修复内存泄漏
- 开发者须知:关于 Android L 的一切
- Javascript远程加载框架 - JFO Remote Framework 1.0
- yum更新php版本,yum php版本太低怎么办
- python flink_如何在 Apache Flink 中使用 Python API?
- 解决在极光推送的时候会出现一个 JPush提示:缺少统计代码
- 软件吞噬世界之前 SDS还要解决这些问题
- vim配置运行python3快捷键_Linux VIM8 Python3 编辑器配置文件
- Sprd平台添加Camera驱动(SL8521E/SC9820E)
- Android抓包工具Charles(青花瓷)
- 清华紫光输入法linux,紫光拼音输入法
- (专升本)Excel(自动填充数据)
- 200个案例5大应用场景最全AI“战疫”武器
- DOM实现元素拖拽,滚轮事件和特效动画缓冲运动处理
- 双网卡同网段静态路由_WINDOWS系统下双网卡设置路由 本文主要涉及到静态路由...
- 消费者洞察:数据影响消费,消费营造数据