在开发中,进行网络请求的时候,通常需要添加HUD来屏蔽用户操作。
在每次请求时添加HUD代码十分繁琐且易忘,所以将添加的HUD代码段封装到网络请求类中。
该封装类可做到:
1.进行网络请求时检查网络是否可用
2.添加网络请求时提醒是否添加HUD
3.在CJSHUDHelper 可自定义 MBProgressHUD 的样式,使用者也可以使用其他第三方HUD ,只需将添加HUD的代码放到相应的 block 中即可
封装思路:
利用 block 在适当的时候添加或移除 HUD
使用步骤:
1.下载CJSNet-Hud工程(地址在最下方)
2.将CMClasses文件夹添加到工程中
3.需要进行网络请求的类 import "CMClasses.h"
#import "CMClasses.h"
4.在NetWorkingConst.m中设置请求地址等参数(添加完具体请求地址后不要忘记在NetWorkingConst.h中声明)
#import "NetWorkingConst.h"
// 测试基地址
#define NetWorkBaseUrl_test @"后台给的测试基地址"
// 生产基地址
#define NetWorkBaseUrl_product @"后台给的生产基地址"
NSString *const TOKEN = @"token";
// 解析外层字典所需参数 参考接口文档自行修改
NSString *const NetWorkCode = @"code";
NSString *const NetWorkMessage = @"message";
NSString *const NetWorkData = @"Data";
NSString *const NetWorkSucceedCode = @"200";
// 基地址
NSString *const NetWorkBaseUrl = NetWorkBaseUrl_product;
// 具体请求地址
NSString *const NetLogin = @"具体请求地址";
说明:请求地址是由“基地址”+“具体请求地址”拼接而来 ,请用NetWorkingHelper中的makeURLString方法拼接
/**
* 拼接参数
*
* @param String 地址
* @return 请求的URL
*/
+ (NSString *)makeURLString:(NSString *)String;
5.在需要请求的地方调用方法(以post请求为例,get同理)
/**
post 请求
@param URLString 请求地址
@param parameters 请求参数
@param showHudBlock 添加HUD的block(不需要可传 nil)
@param warningHudBlock 展示提示信息HUD的block(不需要可传 nil)
@param hidenHudBlock 移除HUD的block(不需要可传 nil)
@param success 成功回调
@param failure 失败回调
*/
+ (void)postWithURLString:(NSString *)URLString
parameters:(id)parameters
showHudBlock:(void (^)(void))showHudBlock
warningHudBlock:(void (^)(NSString *))warningHudBlock
hidenHudBlock:(void (^)(void))hidenHudBlock
success:(void (^)(id responseObject))success
failure:(void (^)(NSError * error))failure;
不需要 HUD 时,上面的 block 参数传 nil ;
具体请求代码:
//设置参数
NSDictionary *params = @{@"userName":@"xiaoMing",
@"userPassword":@"123456"
};
// 发起请求
[NetWorkingHelper postWithURLString:[NetWorkingHelper makeURLString:NetLogin] parameters:params showHudBlock:^{
[CJSHUDHelper showWaitHud:@"转圈圈.."];
} warningHudBlock:^(NSString * warning){
[CJSHUDHelper showWaringHud:warning];
} hidenHudBlock:^{
[CJSHUDHelper hidenHud];
} success:^(id responseObject) {
} failure:^(NSError *error) {
}];
封装代码解析(以post请求为例,get同理)
#pragma mark -- POST请求 --
+ (void)postWithURLString:(NSString *)URLString
parameters:(id)parameters
showHudBlock:(void (^)(void))showHudBlock
warningHudBlock:(void (^)(NSString *))warningBlock
hidenHudBlock:(void (^)(void))hidenHudBlock
success:(void (^)(id responseObject))success
failure:(void (^)(NSError * error))failure{
// 如果有HUD 则添加HUD
if (showHudBlock) {
showHudBlock();
}
// 检查网络状态 并设置 回调 block
[self checkNetStatusAndDoNetWork:^{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 可以接受的类型
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// 请求超时时间
manager.requestSerializer.timeoutInterval = 5;
// 请求队列的最大并发数
manager.operationQueue.maxConcurrentOperationCount = 5;
[manager POST:URLString parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (showHudBlock) {
// 如果有HUD 则移除HUD
hidenHudBlock();
}
// 调用请求成功回调
[self requestSucceedResponseObject:responseObject success:success warningBlock:warningBlock];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (showHudBlock) {
// 如果有HUD 则移除HUD
hidenHudBlock();
}
// 调用请求失败回调
[self requestFailureError:error failure:failure warningBlock:warningBlock];
}];
} showHudBlock:showHudBlock warningBlock:warningBlock hidenHudBlock:hidenHudBlock];
}
请求成功的回调解析数据的一些说明
/**
请求成功的回调
@param responseObject 请求返回的Obj
@param success 成功block
@param warningBlock 展示提示信息HUD的block
*/
+ (void)requestSucceedResponseObject:(id _Nullable) responseObject
success:(void (^)(id responseObject))success
warningBlock:(void(^)(NSString *))warningBlock{
if (success) {
// 网络请求返回的字典
NSDictionary *resultDict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
// 请求结果状态码
NSString *code = [resultDict objectForKey:NetWorkCode];
if ([code isEqualToString:NetWorkSucceedCode]) {
/*
{ code:200
message:"请求成功"
data:{ name:"小明"
sex:"男"
....
}
}
通常网络请求返回的数据的最外层字典只是用来判断请求是否成功的,并没有实质性的内容,所以我们在这里将最外层字典剥开,向内部回调真正的有用数据:
{ name:"小明"
sex:"男"
....
}
在这里解析外层字典,可以让每次网络请求时不必再写 解析外层字典的冗余代码
*/
NSDictionary *dataDict = [resultDict objectForKey:NetWorkData];
success(dataDict);
}else{
/*
{ code:400
message:"查无此人"
data:{
}
}
当请求失败时(服务器有正常的返回值),提示错误信息。
*/
NSString *message = [NSString stringWithFormat:@"%@",[resultDict objectForKey:NetWorkMessage]];
if (warningBlock) {
warningBlock(message);
}
}
}
}
更新:
在二楼的提醒下笔者将 HUD 和 网络请求进行了解耦处理
如有问题,敬请指正