ASIHTTPRequest 问题总结
今天在项目中发现一个ASIHttpRequest的Bug。这个Bug可能会导致你Http请求延时至少在timeout设置时间结束之后。更可怕的是,为了找出这个Bug,可能会浪费程序员更多的时间。为这个问题我至少奋斗了3个小时!
项目中一直在使用ASIHttpRequest,但有一次,我发现Http请求居然总是不成功。我下意识地以为这是网络延时问题,我延长了ASIHttpRequest的超时时间至30秒,于是程序不再报错。
但今天在使用同样的代码时,我发现以前我全错了。这不是超时的问题,而是ASIHttpRequest的一个Bug。
因为这次我请求本机的Tomcat服务器的某个jsp页面,页面代码写得很简单,在firefox中请求该页面的响应时间不会超过0.01秒,但在iPhone模拟器中居然用了20多秒才返回。这不可能是网络延时的原因。
当我把超时时间改小至10秒,等待超时时间结束,ASIHttpRequest甚至直接报kCFStreamEventErrorOccurred错误。
我打开ASIHttpRequest的所有调试日志,发现ASIHttpRequest似乎在尝试用上次的连接去连接服务器:
Request #3 will use connection #2
Request attempted to use connection #2, but it has been closed -will retry with a new connection
Request #3 will use connection #3
它好像连接时重用上次的http连接。这样肯定是不行的,因为上次的http请求结束后服务器已经把连接关闭了。
于是我们只能把ASIHttpRequest的连接重用关闭:
[requestsetShouldAttemptPersistentConnection:NO];
这样,前面的问题就不会出现了。其实,在不同的http会话中,不应该开启PersistentConnection。
2,iOS使用ASIHTTPRequest请求过来的数据中包含utf-8字符
在使用ASIHTTPRequest请求一个接口时,使用NLog打印出返回的Json串,发现有很少一部分汉字显示的是其UTF-8编码的样式,比如“考试”会显示为“考\350\257\225”,其中\350\257\225是“试”utf-8编码,而且没有规律,有些时候这个字显示不正常,有时候显示正常,Android上没有这种问题,在服务端打印出生成的JSON也是正常的,所以接口返回值应该没有问题。服务器返回头的编码是UTF-8,ASIHTTPRequest也设置了UTF8编码:
request.defaultResponseEncoding = NSUTF8StringEncoding;
现在怀疑是 ASIHTTPRequest的问题,不知大家谁遇见过这样的问题,谢谢!
3,谨慎使用ASIHttpRequest的block特性
使用ASIHttpRequest的setCompletionBlock、setFailedBlock时碰到一些诡异的内存泄漏和莫名其妙的行为(如:无法release对象)。经过与同事的讨论、查找资料终于得以解决,全是对block理解不透彻惹的祸。
1. 声明ASIHttpRequest时一定要使用__block关键字
__block关键字告诉block不要retain request,这对于防止循环retain非常重要!!因为request总是会retain block.
2. 谨慎处理block与对象的关系
当setCompletionBlock/setFailedBlock内部使用对象的instance var时,self会被retain(If you access an instance variable by reference, self is retained;)。所以在request结束前向对象发送release消息不会导致对象的释放(dealloc),亦即:该对象依然可进行所有操作,这将导致诸多你意想不到的结果。
3. 解决第2点的问题
3.1 仔细拿捏block与对象的关系 + 按值的方式访问instance var(If you access an instance variable by value, the variable is retained.)
3.2 不使用block,而使用ASIHttpRequestDelegate
4. 参考资料
4.1 http://allseeing-i.com/ASIHTTPRequest/How-to-use - Using blocks
4.2 Blocks Programming Topics - Object and Block Variables
ASIHTTPRequest 问题总结的更多相关文章
- ASIHTTPRequest取消异步请求
今天碰到一个问题 异步请求等待中 cancel后会发生什么,网上找了下资料说取消的请求默认都会按请求失败处理,并调用请求失败delegate 查找到的资料具体解释了下ASIHTTPRequest取消异 ...
- 强大的HTTP包装开源项目ASIHTTPRequest介绍
ASIHTTPRequest 是一个直接在CFNetwork上做的开源项目,提供了一个比官方更方便更强大的HTTP网络传输的封装.它的特色功能如下: 1,下载的数据直接保存到内存或文件系统里 2,提供 ...
- ASIHttpRequest 使用理解
开源库:ASIHttpRequest ASIHttpRequest 下载网址:http://github.com/pokeb/asi-http-request 依赖的5个库文件:CFNetwork, ...
- ASIHTTPRequest中数据压缩问题与gzip
出现了类似问题,先mark,以后修改 最近使用asi发现,部分网络回调数据不能正常的json解析,将responseHeaders头打印出来,才发现公司服务器部分数据添加了gzip压缩传输. 最近简单 ...
- ASIHTTPRequest详解 [经典3]
大文件断点续传 0.94 以后支持大文件的断点下载,只需要设置: [ request setAllowResumeForFileDownloads:YES ]; [ request setDownlo ...
- ASIHTTPRequest详解 [经典]
ASIHTTPRequest 对CFNetwork API进行了封装,并且使用起来非常简单,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中.ASIHTTPR ...
- IOS学习笔记25—HTTP操作之ASIHTTPRequest
IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...
- ASIHTTPRequest类库简介和使用说明
官方网站: http://allseeing-i.com/ASIHTTPRequest/ .可以从上面下载到最新源码,以及获取到相关的资料. 使用iOS SDK中的HTTP网络请求API,相当的复杂, ...
- 用Block封装ASIHttpRequest
用Block封装ASIHttpRequest 横方便的网络请求方法,不用每次都写代理方法.使代码先得很整齐,不会凌乱. 接口部分: // // LYHASIRequestBlock.h // ASIB ...
- iOS用ASIHttpRequest上传
1.新建一个single view工程,导入ASIHttpRequest库,导入MobileCoreServices.CFNetwork.SystemConfiguration和libz1.2.5.d ...
随机推荐
- 我给女朋讲编程网络系列(2)--IIS8 如何在本地发布网站
通过IIS8 在本地发布网站,一个截图,你就全明白了,越是简单,越是实用. 如果有现成的网站,就将你的网站放到一个文件夹中,比如WebTest2中. 如何没有网站,可以在WebTest2中新建一个in ...
- C++ map 的用法归纳2
[尊重原著: http://blog.csdn.net/zcf1002797280/article/details/7847819] Map是c++的一个标准容器,它提供了很好一对一的关系,在一些程序 ...
- yum 快速安装 Rabbitmq for CentOS6
1.安装CENTOS6的系统. 2.配置源 ,说明:https://github.com/rabbitmq/erlang-rpm To use Erlang 20.x on CentOS 6: # I ...
- PAT1034
本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: # include<iostream> # include<algorithm> # include<st ...
- Git详解之二 Git基础 转
http://www.open-open.com/lib/view/open1328069733264.html Git 基础 读完本章你就能上手使用 Git 了.本章将介绍几个最基本的,也是最常用的 ...
- Codeforces 785D Anton and School - 2 (组合数相关公式+逆元)
D. Anton and School - 2 time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Codeforces Beta Round #95 (Div. 2) C 组合数学
C. The World is a Theatre time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- 理解exports
webpack-nodejs-模块系统 其实,Module.exports才是真正的接口,exports只不过是它的一个辅助工具. 最终返回给调用的是Module.exports而不是exports. ...
- git ssh 生成步骤
Git是分布式的代码管理工具,远程的代码管理是基于SSH的,所以要使用远程的Git则需要SSH的配置. github的SSH配置如下: 一 . 设置Git的user name和email: $ git ...
- 在LINQ TO SQL 中使用MVC3中的DataAnnotations 【MetadataType】
原文发布时间为:2011-04-07 -- 来源于本人的百度文章 [由搬家工具导入] http://stackoverflow.com/questions/1535662/asp-net-mvc-li ...