一.思路
整個項目的所有api請求
看成一個tableView
,那么每一個api請求
就相當(dāng)于一個cell
。每一次api請求
,就是把parameters
和url
賦值給cell
,然后調(diào)用afn的api
裕循。
- 在調(diào)用
afn的api
之前,先監(jiān)聽一下當(dāng)前網(wǎng)絡(luò)狀態(tài)净刮,做相應(yīng)的邏輯處理剥哑。 - 退出某個頁面之前,
api請求
還沒有結(jié)果返回淹父,取消該請求株婴。
二.第一層封裝(簡單的調(diào)用afn)
- (NSURLSessionDataTask *)requestWithConfigure:(HttpRequestConfigure *)configure
Success:(ResponseSuccess)success
Failure:(ResponseFailed)failure
Finished:(ResponseFinished)finished{
AFHTTPSessionManager *sessionManger = [AFHTTPSessionManager sharedManager];
// -- 網(wǎng)絡(luò)超時時間設(shè)置 --
[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;
}
// --如果還需要其他類型的請求,可以在這里繼續(xù)添加--
}
}
如果afn
更新暑认,相應(yīng)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;
}
}
- 將外部傳進(jìn)來的
parameters
和url
賦值給請求配置cell
(即HttpRequestConfigure對象)
蘸际,把cell
傳遞到第一層座哩。 - 在調(diào)用第一層方法之前,判斷
網(wǎng)絡(luò)可用性
(使用Reachability
):
[[HttpNetwork sharedNetwork] isReachable]
四. 外部調(diào)用
// 沒有回調(diào)
[HttpRequestTool sendRequest:^(HttpRequestConfigure *configure) {
configure.requestType = RequestTypePOST;
configure.specialUrl = kHomePage_Ad_URL;
}];
// 成功回調(diào)
[HttpRequestTool sendRequest:^(HttpRequestConfigure *configure) {
configure.requestType = RequestTypePOST;
configure.specialUrl = kHomePage_Ad_URL;
} Success:^(NSDictionary *dict) {
NSLog(@"dict:%@",dict);
}];
// 失敗回調(diào)
[HttpRequestTool sendRequest:^(HttpRequestConfigure *configure) {
configure.requestType = RequestTypePOST;
configure.specialUrl = kHomePage_Ad_URL;
} Failure:^(NSString *reason) {
NSLog(@"reason:%@",reason);
}];
// 結(jié)束回調(diào)
[HttpRequestTool sendRequest:^(HttpRequestConfigure *configure) {
configure.requestType = RequestTypePOST;
configure.specialUrl = kHomePage_Ad_URL;
} Finished:^(NSDictionary * _Nullable dict, NSString *reason) {
NSLog(@"--");
}];
// 成功和失敗回調(diào)
[HttpRequestTool sendRequest:^(HttpRequestConfigure *configure) {
configure.requestType = RequestTypePOST;
configure.specialUrl = kHomePage_Ad_URL;
} Success:^(NSDictionary *dict) {
NSLog(@"dict:%@",dict);
} Failure:^(NSString *reason) {
NSLog(@"reason:%@",reason);
}];
// 成功粮彤,失敗和結(jié)束回調(diào)
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
)的時候調(diào)用。
五. Demo
六.討論
該請求工具我親試导坟,沒有發(fā)現(xiàn)什么問題屿良,而且也非常方便。如果遇到問題或者有什么建議惫周,歡迎評論探討管引。