ASI使用介绍(同步与异步)

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];
}

你可能感兴趣的:(ASIHTTPRequest)