利用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

时间: 2024-10-08 21:39:52

利用block 在网络请求回调方式上优化整合代码的相关文章

iOS中使用block进行网络请求回调

iOS中使用block进行网络请求回调 HttpRequest.h // // HttpRequest.h // UseBlockCallBack // // Created by Michael on 2/13/14. // Copyright (c) 2014 EIMS. All rights reserved. // #import <Foundation/Foundation.h> typedef void (^FinishBlock)(NSString *dataString); @

用Block封装网络请求

#import <Foundation/Foundation.h> // 定义一个枚举typedef NS_ENUM(NSInteger) {    LY_GET,    LY_POST} URLRequestMethod;///定义返回block网络请求结果typedef void(^ResultBlock)(NSData *data,NSURLResponse *response,NSError *error); @interface LYNetWorkRequestManager : N

四种网络请求的方式封装网络请求

封装网络请求类便捷, 适合多个地方使用. 第一封装下载方法 前提用Cocoapods或者直接引用第三方AFNetWorking 定义一个类NetWorkingManager, 继承于NSObject A: 在.h中写方法声明 #import <Foundation/Foundation.h> @interface NetWorkManager : NSObject - (void)downLoadWithUrl:(NSString *)url progress:(void(^)(float p

iOS 网络请求 NSURLSession 的上传文件方法

NSURLSession/NSURLConnection的上传文件方法 此篇文章的理论基础主要是与HTTP网络通信协议相关.为集中精力,可以先把TCP/IP协议这些置之不理,也就是先只关注HTTP的请求和响应的结构.HTTP完整的原理内容就此略过.在此只略提相关内容.文中涉及的设计源码可以通过这里获取 https://github.com/wuqingjian2015/uploadHelper,有意者可以去看看. HTTP是干什么用的呢? 先考虑一下以下应用过程: 从客户端向服务器端发起一个请求

block传值以及利用block封装一个网络请求类

1.block在俩个UIViewController间传值 最近刚学了几招block 的高级用法,其实就是利用block语法在俩个UIViewController之间传值,在这里分享给初学者,同时也方便我自己理解.我们知道UINavigationController类管理UIViewController的时候,利用的是"栈"的思想,在这里不做过多解释,切入正题,假设我们现在有俩个UIViewController,viewC1和viewC2,viewC1比viewC2先进入到UINavi

Android开发之网络请求通信专题(二):基于HttpClient的文件上传下载

上一篇专题Android开发之网络请求通信专题(一):基于HttpURLConnection的请求通信我们讲解了如何使用httpurlconnection来实现基本的文本数据传输.一般在实际开发中我们可以用于传输xml或者json格式的数据.今天我们来讲解另外一种http网络请求的方式:httpclient,并实现文件的上传和下载. 在这里插个题外话,其实这些网络请求有很多第三方jar包可以使用,这些包都封装得很好了.如果只是想使用,我们就直接拿别人得jar包来用就好.博主这里推荐一个叫xuti

iOS_网络请求_代理方式

#pragma mark - 网络请求代理方式(异步) - (IBAction)DelegateButtonDidClicked:(UIButton *)sender { // 1.拼接 urlString,网址里面必须写 http:// NSString *urlString = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx? date=20131129&startRe

Windows Phone 网络请求方式对比

目前的Windows Phone平台支持有以下几种实现网络请求的方式:HttpWebRequest.WebClient.WebBrowser.Socket 我个人给他们分个类: 最实用,最麻烦:HttpWebRequest 最简洁:WebClient 最猥琐:WebBrowser 最不常用:Socket 可能用到的一些wp源码案例:http://code.662p.com/list/14_1.html 1.HttpWebRequest: 能实现各种WP上支持的请求类型(目前支持POST/GET)

[每天记录一个Bug]Cell中由于block加载网络请求产生的复用

Bug 出现场景: cell中使用加载图片的网络请求出现复用,截图如下: 复用原因: Cell Model中只有一个用户的uid,所有用户相关信息:例如头像\名称\信息等是通过 block请求,通过uid 回调中取到的字段,但由于是在cell中通过系统的block回调中下载得到的头像,所以会有延时问题. 当使用 self.collection reloadData ,这个语句的时候,由于4个cell的头像还没加载成功,瞬间又重新复用4个cell出来,就会产生复用的情况. 也就是说  4个cell