IOS网络通信
之第三方框架ASIHttpRequest的简单使用
一. ASIHttpRequest的简介
ASIHttpRequest库是iphone下一个http网络访问的第三方库,该库主要是用core sevice开发的。ASIHTTPRequest就是一个对CFNetwork API进行了封装,并且使用起来非常简单的一套API,ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互。
ASI类库里包括22个文件,4个主要的类ASIHTTPRequest 、ASIFormDataRequest、ASINetworkQueue、ASIDownloadCache,5个支持的类ASIInputStream、ASIDataDecompressor、ASIDataCompressor、ASIAuthenticationDialog、Reachability,4个协议配置文件ASIHTTPRequestDelegate、ASIProgressDelegate、ASICacheDelegate、ASIHTTPRequestConfig.h,这些文件作用在开发文档中都有详细介绍.注意ASIHttpRequest中有一个苹果官方给出的Reachability用于检测当前网络状况
二. ASIHttpRequest的导入
在你的工程中使用ASIHttpRequest,需要如下步骤:
1.导入ASIHttpRequest第三方框架
往一个Xcode项目中添加第三方类库文件,有两种方式:
1. 第一种方式,在Finder中打开需要添加的文件或文件夹,在Xcode中打开要添加文件的项目,然后选中要添加的文件或文件夹,将它从Finder中拖到Xcode中,然后释放。在弹出的对话框中,如果文件已经拷贝到了项目文件目录中,则不需要选中“Copy items”的复选框;如果文件没有拷贝到项目文件目录,就需要选中“Copyitems”的复选框,这样Xcode会自动把文件复制到项目文件目录下。如下图所示:
2. 第二种方式,在Xcode中,在要添加文件的分组下点右键,选中“Add Files to “My Project”…”菜单,在弹出的文件浏览对话框中选中要添加到文件或文件夹。如果要添加文件已经拷贝到了项目文件目录中,则不需要选中“Copy items”的复选框;如果文件没有拷贝到项目文件目录,就需要选中“Copyitems”的复选框,这样Xcode会自动把文件复制到项目文件目录下。如下图
所示:
2.添加ASIHTTPRequest依赖的5个库文件:CFNetWork,SystemConfiguration,MobileCoreServices,libz和libxml2(5个库文件缺一不可,否则ASIHTTPRequest无法使用)
1.选中项目
2.选中目标
3.跳转到“Build Phases”标签
4.展开“Link Binary With Libraries”分组
5.点击“+”添加类库
至此,完成以上两个步骤ASIHttpRequest第三方类库就已经成功导入到你的工程中.
然后在需要应用它的代码文件头部,加入:#import“ASIHTTPRequest.h”,这样就可以在代码中使用ASIHTTPRequest相关的类。
三. ASIHttpRequest的简单使用
1.同步/异步方式请求数据
1)同步请求(注意:同步请求会阻塞主线程,导致界面不响应用户操作)
//构建request对象
ASIHTTPRequest *request= [[ASIHTTPRequest alloc]initWithURL:url];
//设置请求方式
[requestsetRequestMethod:@"GET"];
//发起同步请求
[requeststartSynchronous];
//使用error属性来检查结果状态
NSError*error = request.error;
if(error == nil) {
//获取请求到得数据
NSData *data = request.responseData;
}else
{
NSLog(@"请求数据失败");
}
2)异步请求
ASIHTTPRequest *request =[[ASIHTTPRequest alloc]initWithURL:url];
//设置代理
request.delegate= self;
//发起异步请求
[request startAsynchronous];
ASIHTTPRequest的代理方法:
-(void)requestStarted:(ASIHTTPRequest *)request;//请求开始时调用
- (void)request:(ASIHTTPRequest*)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders;//收到请求头时调用
- (void)request:(ASIHTTPRequest*)request willRedirectToURL:(NSURL *)newURL;//改变请求的URL时调用
-(void)requestFinished:(ASIHTTPRequest *)request;//请求完成时调用
- (void)requestFailed:(ASIHTTPRequest*)request;//请求失败时调用
-(void)requestRedirected:(ASIHTTPRequest *)request;//请求已被重定向时调用
对于取消异步请求要注意一下两点:
(1)取消一个异步请求(无论request是由[request startAsynchronous]开始的还是从你创建的队列中开始的),使用[request cancel]即可。注意同步请求不可以被取消。
(2)如果你取消了一个request,那么这个request将会被视为请求失败,并且request的代理或者队列的代理的失败代理方法将被调用。如果你不想让代理函数被调用,那么将delegate设置为nil,或者使用clearDelegatesAndCancel(清除所有的代理和block)方法来取消request。
3)使用block
//设置请求完成后调用的block
[requestsetCompletionBlock:^{
}];
//设置请求失败后回调的block
[requestsetFailedBlock:^{
}];
2.定义下载队列,让队列中的任务按指定的并发数来下载(队列下载必须是异步的)
if (![self queue]) {
//也可以使用ASINetworkQueue它是NSOperationQueue的子类,提供更高级的特性
self.queue = [[NSOperationQueue alloc]init];
//设定最大并发数
[self.queuesetMaxConcurrentOperationCount:3];
}
NSURL*url = [NSURL URLWithString:@"http://www.baidu.com"];
ASIHTTPRequest*request = [ASIHTTPRequest requestWithURL:url];
[requestsetDelegate:self];
//如果不设定selector,那么系统会使用默认的requestFinished:和 requestFailed:方法
[requestsetDidFinishSelector:@selector(finishAction:)];
[requestsetDidFailSelector:@selector(failAction:)];
//如果需要对队列里面的每个request进行区分,那么可以设定request的userInfo属性,它是个NSDictionary,或者更简单的方法是设定每个request的tag属性,这两个属性都不会被发送到服务器。
NSDictionary*userInfo = [NSDictionarydictionaryWithObjectsAndKeys:request,@"first",nil];
[requestsetTag:100];
[requestsetUserInfo:userInfo];
[[selfqueue] addOperation:request];
关于ASINetworkQueue还要注意它与NSOperationQueue的区别:
(1) ASINetworkQueues加入队列的request不会立即开始执行。如果队列打开了进度开关,那么队列开始时,会先对所有GET型request进行一次HEAD请求,获得总下载大小,然后真正的request才被执行。
(2) 当ASINetworkQueue中的一个request失败时,默认情况下,ASINetworkQueue会取消所有其他的request。要禁用这个特性,设置 [queuesetShouldCancelAllRequestsOnFailure:NO]。
(3) ASINetworkQueues只可以执行ASIHTTPRequest操作,而不可以用于通用操作。试图加入一个不是ASIHTTPRequest的NSOperation将会导致抛出错误。
还有一个会引起程序崩溃的原因特别需要注意:
request并不retain它们的代理,所以有可能你已经释放了代理,而之后request才完成,这将会引起崩溃。大多数情况下,如果你的代理即将被释放,你一定也希望取消所有request,需要如下的dealloc方法:
- (void)dealloc
{
[requestclearDelegatesAndCancel];
[requestrelease];
[super dealloc];
}
以上是一些ASIHttpRequest的简单用法,限于篇幅就写到这里,有什么不懂的欢迎留言.
对ASIHttpRequest高级用法感兴趣的亲们,可以参考我的下一篇博文.