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

  • 相关阅读:
    Java的静态块与实例块(转)
    Programming Ability Test学习 1031. Hello World for U (20)
    Programming Ability Test学习 1011. World Cup Betting (20)
    Programming Ability Test学习 1027. Colors in Mars (20)
    Programming Ability Test学习 1064. Complete Binary Search Tree (30)
    Programming Ability Test学习 1008. Elevator (20)
    【maven详解-生命周期】Maven的生命周期和插件
    【maven详解-插件】maven插件学习之源码插件Source Xref
    $(document).ready(){}、$(fucntion(){})、(function(){})(jQuery)onload()的区别
    你还没真的努力过,就轻易输给了懒惰
  • 原文地址:https://www.cnblogs.com/lisa090818/p/4249738.html
Copyright © 2011-2022 走看看