ASIHTTPRequest框架使用总结系列之阿堂教程3(异步请求)

 上一节中,阿堂和网友们分享了ASIHTTPRequest框架对于get,post的同步请求方式。很显然,如果网速比较慢,查询的时候会一直很黑屏,直到请求结束界面才出现结果,这样用户体验肯定很不好了。正如上节阿堂所说,同步请求一般只是在某个子线程中使用,而不在主线程中使用。

 
      ASIHTTPRequest和ASIFormDataRequest两个请求类都可以发送异步请求,而后者继承了前者的异步请求方法,所以这里阿堂重点介绍ASIHTTPRequest的异步请求。异步请求后的处理通过回调委托对象的方法requestFinished: 或requestFailed:实现的。
 
一.对于get的异步请求
 

 

-(void)startRequest

{   

    NSString *strURL = [[NSString alloc]initWithFormat:@"http://www.crazyit.com/service/mynotes/webservice.php?email=%@&type=%@&action=%@",@"heyitang@qq.com",@"JSON",@"query"];

    

NSURL *url = [NSURL URLWithString:[strURL URLEncodedString]];

 

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

//设置委托对象为self

    [request setDelegate:self];

    

//自定议回调方法 requestSuccess, requestError (方法名字可以随便取)

//如果没有设置回调方法,如下两行不需要,会默认调用 requestFinished, requestFailed 方法 

    [request setDidFinishSelector:@selector(requestSuccess:)];

    [request setDidFailSelector:@selector(requestError:)];

    

    [request startAsynchronous];

    

}

 

 

- (void)requestSuccess:(ASIHTTPRequest *)request

{

        NSData *data  = [request responseData];

        NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:dataoptions:NSJSONReadingAllowFragments error:nil];

        [self reloadView:resDict];

}

 

- (void)requestError:(ASIHTTPRequest *)request

{

    NSError *error = [request error];

    NSLog(@"%@", [error localizedDescription]);

}

 

 

//重新加载表视图

-(void)reloadView:(NSDictionary*)res

{

    NSNumber *resultCodeObj = [res objectForKey:@"ResultCode"];

    if ([resultCodeObj integerValue] >=0)

    {

        self.listData = [res objectForKey:@"Record"];

        [self.tableView reloadData];

    } else {

        NSString *errorStr = [resultCodeObj errorMessage];

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"错误信息"

                                                            message:errorStr

                                                           delegate:nil

                                                  cancelButtonTitle:@"OK"

                                                  otherButtonTitles: nil];

        [alertView show];

    }

    

    

}

 

测试截图

ASIHTTPRequest框架使用总结系列之阿堂教程3(异步请求)

 

 

二. 对于get异步请求的代码Block块指定回调方法

 

 

-(void)startRequest

{   

    NSString *strURL = [[NSString alloc]initWithFormat:@"http://www.crazyit.com/service/mynotes/webservice.php?email=%@&type=%@&action=%@",@"heyitang@qq.com",@"JSON",@"query"];

    

NSURL *url = [NSURL URLWithString:[strURL URLEncodedString]];

    

    __weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

    [request setCompletionBlock:^{

 

        NSData *data  = [request responseData];

        NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:dataoptions:NSJSONReadingAllowFragments error:nil];

        [self reloadView:resDict];

        

    }];

    [request setFailedBlock:^{

        NSError *error = [request error];

        NSLog(@"%@", [error localizedDescription]);

 

    }];

    [request startAsynchronous];

    

}

 

//重新加载表视图

-(void)reloadView:(NSDictionary*)res

{

    if (self.refreshControl) {

        [self.refreshControl endRefreshing];

        self.refreshControl.attributedTitle = [[NSAttributedString alloc]initWithString:@"下拉刷新"];

    }

    

    NSNumber *resultCodeObj = [res objectForKey:@"ResultCode"];

    if ([resultCodeObj integerValue] >=0)

    {

        self.listData = [res objectForKey:@"Record"];

        [self.tableView reloadData];

    } else {

        NSString *errorStr = [resultCodeObj errorMessage];

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"错误信息"

                                                            message:errorStr

                                                           delegate:nil

                                                  cancelButtonTitle:@"OK"

                                                  otherButtonTitles: nil];

        [alertView show];

    }

    

    

 

}

 

说明:

     setCompletionBlock:^{...} 和 setFailedBlcok:^{...}调用的代码块,这两个方法分别在成功和失败时回调。使用代码块会有一些小问题,它可能会造成循环保持(retain cycle)问题。循环保存是一个内存问题,假设a对象保持了b对象,b对象又保持了a对象,a和b都无法翻释放。为了解决代码块循环问题。我们在声明ASIHTTPRequest对象之前使用了_ _ weak关健字,它的意思是ASIHTTPRequest对象是弱引用,这一点和java中的说法比较类似,不进行保持处理。 这种方式适合于ios5之后的arc内存管理方式。如果是mrc内存管理方式,需要在ASIHTTPRequest对象之前使用_block关健字。

 

三.对于post的异步方式,和get类似,我就不多说了。 可以参照 上篇文章中的同步方式的写法,稍微变动下即可。

posted @ 2015-01-26 11:03  如来藏  阅读(193)  评论(0编辑  收藏  举报