本人录制技术视频地址:https://edu.csdn.net/lecturer/1899 欢迎观看。
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;
- (void)dealloc {
[self.request clearDelegatesAndCancel];
}