IOS网络通信 之第三方框架ASIHttpRequest的简单使用

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高级用法感兴趣的亲们,可以参考我的下一篇博文.

你可能感兴趣的:(ios,异步,ASIHTTPRequest,第三方框架,网络通信)