首页 > 代码库 > 利用block 在网络请求回调方式上优化整合代码
利用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 @since10 */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 pigpigdaddy10 @since 3.011 */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 pigpigdaddy10 @since 3.011 */12 - (void)requestWithUrlString:(NSString *)urlString complection:(commonBlock)complection failure:(commonBlock)failure13 {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 //定义通用的block2 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
利用block 在网络请求回调方式上优化整合代码