ASI 即 ASIHTTPRequest。 官方网站: http://allseeing-i.com/ASIHTTPRequest/ 。可以从上面下载到最新源码,以及获取到相关的资料。
使用iOS SDK中的HTTP网络请求API,相当的复杂,调用很繁琐,ASIHTTPRequest就是一个对CFNetwork API进行了封装,并且使用起来非常简单的一套API,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中。ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互。光说不练假把式,以下的几个章节我将介绍以下ASI的使用场合。这一节我介绍同步与异步的概念及使用。
同步与异步的概念:
同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事.
异步:当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
ASI的同步使用
// 同步请求 - (void)sync { NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"]; // 建立请求的request self.request = [ASIHTTPRequest requestWithURL:url]; // 设置请求超时时长 self.request.timeOutSeconds = 5; // 开始同步请求操作 [self.request startSynchronous]; if(self.request.error){ NSLog(@"Error:%@",[self.request.error localizedDescription]); } else{ // 响应相关信息 NSLog(@"Return Code:%d, Return Message:%@",self.request.responseStatusCode,self.request.responseStatusMessage); NSLog(@"Return String:%@, Return Message:%@",self.request.responseString,self.request.responseData); } }
当代码执行到
[self.request startSynchronous];
这一句的时候,线程会被阻塞,即后面的代码执行不了。必须等待网络数据返回回来的时候,才可以继续执行后面的代码。这也是同步请求的特色。
ASI的异步使用(实现ASIHTTPRequestDelegate)
// 异步请求 - (void)async { NSURL *url = [NSURL URLWithString:@"http://www.youku.com"]; self.request = [ASIHTTPRequest requestWithURL:url]; self.request.timeOutSeconds = 5; self.request.delegate = self; [self.request startAsynchronous]; }
代理方法
- (void)requestFinished:(ASIHTTPRequest *)request { // 响应相关信息 NSLog(@"Return Code:%d, Return Message:%@",request.responseStatusCode,request.responseStatusMessage); NSLog(@"Return String:%@, Return Message:%@",request.responseString,request.responseData); } - (void)requestFailed:(ASIHTTPRequest *)request{ }
ASI的异步使用(block方式)
// 异步请求(block方式) - (void)async { NSURL *url = [NSURL URLWithString:@"http://www.youku.com"]; self.request = [ASIHTTPRequest requestWithURL:url]; self.request.timeOutSeconds = 5; [self.request setStartedBlock:^{ NSLog(@"Begin"); }]; __weak typeof(self.request) that = self.request; [self.request setCompletionBlock:^{ NSLog(@"Result:%@",[NSString stringWithFormat:@"data string:%@",that.responseString]); }]; [self.request startAsynchronous]; }
关于异步请求,需要说明的两点
1. request 这个变量应该进行强引用工作,因为方法async执行完毕后,self.request这个对象就销毁了。在同步请求中不会出现问题,因为得到响应数据后,才销毁self.request对象,但在异步请求的时候对象就会丢失了,获取不到最终的响应数据。request属性定义如下:
@property (nonatomic,strong) ASIHTTPRequest *request;
2. 控制器对象销毁的时候,要销毁request对象! 因为当发出一个请求,也许5秒之后才有响应,没有等到响应回来的时候你就切换了控制器,则产生了野指针!!! 所以一定要在控制器销毁的时候调用下面代码!!
- (void)dealloc { [self.request clearDelegatesAndCancel]; }