AFNetworking封装
2019-03-06 本文已影响0人
wxhan
一.思路
整个项目的所有api请求
看成一个tableView
,那么每一个api请求
就相当于一个cell
。每一次api请求
,就是把parameters
和url
赋值给cell
,然后调用afn的api
。
- 在调用
afn的api
之前,先监听一下当前网络状态,做相应的逻辑处理。 - 退出某个页面之前,
api请求
还没有结果返回,取消该请求。
二.第一层封装(简单的调用afn)
- (NSURLSessionDataTask *)requestWithConfigure:(HttpRequestConfigure *)configure
Success:(ResponseSuccess)success
Failure:(ResponseFailed)failure
Finished:(ResponseFinished)finished{
AFHTTPSessionManager *sessionManger = [AFHTTPSessionManager sharedManager];
// -- 网络超时时间设置 --
[sessionManger.requestSerializer willChangeValueForKey:@"timeoutInterval"];
sessionManger.requestSerializer.timeoutInterval = configure.timeoutInterval;
[sessionManger.requestSerializer didChangeValueForKey:@"timeoutInterval"];
switch (configure.requestType) {
case RequestTypeGET:{
return [sessionManger GET:configure.requestUrl
parameters:configure.parameters
progress:nil
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
success(task,responseObject);
finished(task,responseObject,nil);
}
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
failure(task,error);
finished(task,nil,error);
}];
break;
}
case RequestTypePOST:{
return [sessionManger POST:configure.requestUrl
parameters:configure.parameters
progress:nil
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
success(task,responseObject);
finished(task,responseObject,nil);
}
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
failure(task,error);
finished(task,nil,error);
}];
break;
}
// --如果还需要其他类型的请求,可以在这里继续添加--
}
}
如果afn
更新,相应api
变动,只需要在这里修改。
三.第二层封装
- (NSURLSessionDataTask *)sendRequest:(ResponseConfigure)configureBlock
Success:(SuccessCallBackData)success
Failure:(FailedCallBackReason)failure
Finished:(FinishedCallBack)finished{
HttpRequestConfigure *configure = [HttpRequestConfigure setConfigure];
if (configureBlock) {
configureBlock(configure);
}
HttpRequestConfigure *requestConfigure = [self resetRequestConfiguration:configure];
if ([[HttpNetwork sharedNetwork] isReachable]) {
return [[HttpRequestBasics defaultCenter] requestWithConfigure:requestConfigure Success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *data = [self analyzeResponseData:responseObject];
if (success) {
success(data);
}
} Failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSString *reason = [self returnErrorDescription:error];
if (failure) {
failure(reason);
}
} Finished:^(NSURLSessionDataTask * _Nullable task, id _Nullable responseObject, NSError * _Nullable error) {
NSDictionary *data = [self analyzeResponseData:responseObject];
NSString *reason = [self returnErrorDescription:error];
if (finished) {
finished(data, reason);
}
}];
}
else{
failure(kNotHttpNetExpression);
return nil;
}
}
- 将外部传进来的
parameters
和url
赋值给请求配置cell
(即HttpRequestConfigure对象)
,把cell
传递到第一层。 - 在调用第一层方法之前,判断
网络可用性
(使用Reachability
):
[[HttpNetwork sharedNetwork] isReachable]
四. 外部调用
// 没有回调
[HttpRequestTool sendRequest:^(HttpRequestConfigure *configure) {
configure.requestType = RequestTypePOST;
configure.specialUrl = kHomePage_Ad_URL;
}];
// 成功回调
[HttpRequestTool sendRequest:^(HttpRequestConfigure *configure) {
configure.requestType = RequestTypePOST;
configure.specialUrl = kHomePage_Ad_URL;
} Success:^(NSDictionary *dict) {
NSLog(@"dict:%@",dict);
}];
// 失败回调
[HttpRequestTool sendRequest:^(HttpRequestConfigure *configure) {
configure.requestType = RequestTypePOST;
configure.specialUrl = kHomePage_Ad_URL;
} Failure:^(NSString *reason) {
NSLog(@"reason:%@",reason);
}];
// 结束回调
[HttpRequestTool sendRequest:^(HttpRequestConfigure *configure) {
configure.requestType = RequestTypePOST;
configure.specialUrl = kHomePage_Ad_URL;
} Finished:^(NSDictionary * _Nullable dict, NSString *reason) {
NSLog(@"--");
}];
// 成功和失败回调
[HttpRequestTool sendRequest:^(HttpRequestConfigure *configure) {
configure.requestType = RequestTypePOST;
configure.specialUrl = kHomePage_Ad_URL;
} Success:^(NSDictionary *dict) {
NSLog(@"dict:%@",dict);
} Failure:^(NSString *reason) {
NSLog(@"reason:%@",reason);
}];
// 成功,失败和结束回调
NSURLSessionDataTask *task = [HttpRequestTool sendRequest:^(HttpRequestConfigure *configure) {
configure.requestType = RequestTypePOST;
configure.specialUrl = kHomePage_Ad_URL;
} Success:^(NSDictionary *dict) {
NSLog(@"dict:%@",dict);
} Failure:^(NSString *reason) {
NSLog(@"reason:%@",reason);
} Finished:^(NSDictionary * _Nullable dict, NSString *reason) {
NSLog(@"--");
}];
// 在需要取消请求的地方取消请求
[task cancel];
[task cancel];
取消该线程,一般会在控制器销毁(dealloc
)的时候调用。
五. Demo
六.讨论
该请求工具我亲试,没有发现什么问题,而且也非常方便。如果遇到问题或者有什么建议,欢迎评论探讨。