• 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类似,我就不多说了。 可以参照 上篇文章中的同步方式的写法,稍微变动下即可。

  • 相关阅读:
    Test-Driven Development
    单元测试之道(使用NUnit)
    IoC--structuremap
    web.config的configSections节点
    【转】理解POCO
    js的call(obj,arg)学习笔记
    css隐藏滚动条方法
    regexp学习
    asp后台拼接百度ueditor编辑器过程
    php关键词construct和static
  • 原文地址:https://www.cnblogs.com/lisa090818/p/4249738.html
Copyright © 2020-2023  润新知