zoukankan      html  css  js  c++  java
  • 利用block 在网络请求回调方式上优化整合代码

    项目中经常会遇到一些重复性的劳动,别的不扯远,就说HTTP和SOCKET,发送请求,得到成功返回或失败返回。每次我都需要在不同的逻辑层次中处理成功、失败两个的回调,这样带来的劣势就是代码显得分散和冗长,重复代码很多。于是我利用block,将这一问题做了优化。本文利用ASIHttpRequest库,以最基本的HTTP请求,GET方法为例,说明这一方法。

    最终的效果:

    1     [[PPDHttpRequest shareInstance] requestWithUrlString:@"http://192.168.2.99:5009/message/init/1032/13/0/1" complection:^(id arg) {
    2         //
    3         NSLog(@"%@", arg);
    4     } failure:^(id arg) {
    5         //
    6         NSLog(@"%@", arg);
    7     }];

    三个参数分别是Get方法的URL、成功block“回调”、失败block“回调”。请求与结果整合在同一函数,清晰明了,易于维护。

    完整demo地址:https://github.com/pigpigdaddy/HttpRequestUsingBlockDemo

    下面根据关键点来逐一阐述:

    一:单例模式

    采用单例模式也是为了简化、瘦身、统一管理。关于单例模式的使用方法、原理介绍等不在本文讨论。我认为一般在一个APP中,“底层”网络接口如HTTP接口,用一个类来做就OK了,所有HTTP网络请求都可以通过这一个类接口来进行。如果需要针对不同模块功能分开调用,则可以在此类上在做封装,分出不同的类来负责不同模块的HTTP调用。那么既然底层只需要一个类且整个程序可能随时需要处理HTTP网络请求,那么我决定把他做成一个单例来处理。

     1 @interface PPDHttpRequest : NSObject
     2 
     3 /**
     4  TODO:获取Instance单例
     5  
     6  @return URHTTPRequest 实例对象
     7  
     8  @author pigpigdaddy
     9  @since
    10  */
    11 + (instancetype)shareInstance;
    12 
    13 @end
     1 /**
     2  TODO:获取Instance单例
     3  
     4  @return URHTTPRequest 实例对象
     5  
     6  @author pigpigdaddy
     7  @since
     8  */
     9 + (instancetype)shareInstance{
    10     static PPDHttpRequest *httpRequest;
    11     static dispatch_once_t onceToken;
    12     dispatch_once(&onceToken,^{
    13         httpRequest = [[PPDHttpRequest alloc] init];
    14     });
    15     return httpRequest;
    16 }

    以上是标准的ARC环境下创建单例的代码。

    二,添加请求接口,方法参数包含成功、失败block

    调用方法是本文的关键采用了如下方式:

     1 /**
     2  TODO:http请求
     3  
     4  @param urlString   请求地址
     5  @param parameters  请求参数
     6  @param complection 完成block
     7  @param failure     失败block
     8  
     9  @author pigpigdaddy
    10  @since 3.0
    11  */
    12 - (void)requestWithUrlString:(NSString *)urlString complection:(commonBlock)complection failure:(commonBlock)failure;
     1 /**
     2  TODO:http请求
     3  
     4  @param urlString   请求地址
     5  @param parameters  请求参数
     6  @param complection 完成block
     7  @param failure     失败block
     8  
     9  @author pigpigdaddy
    10  @since 3.0
    11  */
    12 - (void)requestWithUrlString:(NSString *)urlString complection:(commonBlock)complection failure:(commonBlock)failure
    13 {
    14     NSLog(@"---------------PPDHttpRequest    url:%@-----------",urlString);
    15     NSURL *url=[NSURL URLWithString:urlString];
    16     ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:url];
    17     [ASIHTTPRequest setDefaultTimeOutSeconds:60];
    18     [request setDelegate:self];
    19     [request setRequestMethod:@"GET"];
    20     [request setShouldAttemptPersistentConnection:NO];
    21     
    22     //添加信息对象
    23     NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
    24     if (complection){
    25         [userInfo setObject:complection forKey:@"complectionBlock"];
    26     }
    27     if (failure){
    28         [userInfo setObject:failure forKey:@"failureBlock"];
    29     }
    30     [request setUserInfo:userInfo];
    31     
    32     [self.queue addOperation:request];
    33 }

    可以看到,接口调用除了Get方法URL以外,还包含了两个block,这两个block的类型我通过以下方式定义:

    1 //定义通用的block
    2 typedef void(^commonBlock)(id arg);

    拥有一个id类型的参数,用于“返回值”。

    在方法实现中,我将两个block设置到userInfo中,这样,可以在http回调中,进行相应的处理。

    三,处理回调

    正如第二条所指出的那样,在http回调中,让相应的block做出正确响应:

     1 - (void)requestFinished:(ASIHTTPRequest *)request{
     2     NSDictionary *userInfo = request.userInfo;
     3     commonBlock complection = [userInfo objectForKey:@"complectionBlock"];
     4     if (complection){
     5         complection(request.responseString);
     6     }
     7 }
     8 
     9 - (void)requestFailed:(ASIHTTPRequest *)request{
    10     NSDictionary *userInfo = request.userInfo;
    11     commonBlock failure = [userInfo objectForKey:@"failureBlock"];
    12     if (failure){
    13         failure(request.responseString);
    14     }
    15 }

    最终的效果就如文章开头贴出的那段代码一样,将请求、回调整合在了一起。代码简洁明了,易读性高。也易于二次封装。

    多说一句,上层封装时,可以开出不同的方法,接受各种参数,拼接成URL(get),或是表单(post),以及最重要的是,传入成功失败block参数,即可!

    完整demo地址:https://github.com/pigpigdaddy/HttpRequestUsingBlockDemo

    参考文档:

    http://www.cnblogs.com/eagle927183/p/3457538.html

    http://sjpsega.com/blog/2014/05/25/singleton-in-ios/

    http://blog.csdn.net/gideal_wang/article/details/4316691

  • 相关阅读:
    [ACM] hdu 1671 Phone List (特里)
    Android 记录的(MediaRecorder)而播放(MediaPlayer)
    菜鸟进阶Android Touch事件传递(四)
    九度oj题目&吉大考研11年机试题全解
    怎样取消shutdown关机命令?-shutdown命令的使用解析
    怎样下载并编译Android4.0内核源代码goldfish(图文)
    三角函数图像
    HTML里面Textarea换行总结
    java中使用队列:java.util.Queue
    ContentProvider简单介绍
  • 原文地址:https://www.cnblogs.com/pigpigDD/p/3956308.html
Copyright © 2011-2022 走看看