AF是以block的方式将请求结果返回,这样的处理思路我感觉很好,每个请求都单独处理自己的回调。
AF的请求也可以使代理的形式进行回调。
HIHTTPRequest
以代理的形式回调的话需要创建一个请求类,然后将请求结果以代理的形式回调。
HIHTTPRequest.h
#import <Foundation/Foundation.h>
#import "HIHttpRequestUtil.h"
NS_ASSUME_NONNULL_BEGIN
@protocol HIHTTPRequestDelegate <NSObject>
- (void)requestStared:(HIHttpRequestType)requestTag page:(Class)aClass URLString:(NSString *)URLString parameters:(nullable id)parameters;
- (void)requestProgressing:(HIHttpRequestType)requestTag page:(Class)aClass URLString:(NSString *)URLString parameters:(nullable id)parameters progress:(NSProgress *)progress;
- (void)requestFinished:(HIHttpRequestType)requestTag page:(Class)aClass URLString:(NSString *)URLString parameters:(nullable id)parameters success:(id)result;
- (void)requestFailed:(HIHttpRequestType)requestTag page:(Class)aClass URLString:(NSString *)URLString parameters:(nullable id)parameters failure:(NSError *)error;
@end
@interface HIHTTPRequest : NSObject
// delegate callback
@property (nonatomic, weak) id <HIHTTPRequestDelegate> delegate;
// GET. Object Method
- (void)getWithRequestTag:(HIHttpRequestType)requestTag
page:(Class)aClass
URLString:(NSString *)URLString
parameters:(nullable id)parameters;
// cancel a request, cancel the request when dismiss before controller.
+ (void)cancelTask:(HIHttpRequestType)requestTag;
@end
NS_ASSUME_NONNULL_END
HIHTTPRequest.m
#import "HIHTTPRequest.h"
#import "HIHTTPRequestManager.h"
@implementation HIHTTPRequest
- (void)getWithRequestTag:(HIHttpRequestType)requestTag
page:(Class)aClass
URLString:(NSString *)URLString
parameters:(nullable id)parameters
{
if ([self.delegate respondsToSelector:@selector(RequestStared:page:URLString:parameters:)]) {
[self.delegate RequestStared:requestTag page:aClass URLString:URLString parameters:parameters];
}
[HIHTTPRequestManager.manager GETWithRequestTag:requestTag URLString:URLString parameters:parameters progress:^(NSProgress * _Nonnull progress) {
HIDispatch_main_async_safe(^{
if ([self.delegate respondsToSelector:@selector(requestProgressing:page:URLString:parameters:progress:)])
{
[self.delegate HIRequestProgressing:requestTag page:aClass URLString:URLString parameters:parameters progress:progress];
}
});
} success:^(NSURLSessionDataTask * _Nullable task, id _Nonnull result) {
HIDispatch_main_async_safe(^{
if ([self.delegate respondsToSelector:@selector(requestFinished:page:URLString:parameters:success:)]) {
[self.delegate requestFinished:requestTag page:aClass URLString:URLString parameters:parameters success:result];
}
});
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
HIDispatch_main_async_safe(^{
if ([self.delegate respondsToSelector:@selector(requestFailed:page:URLString:parameters:failure:)])
{
[self.delegate requestFailed:requestTag page:aClass URLString:URLString parameters:parameters failure:error];
}
});
}];
}
+ (void)cancelTask:(HIHttpRequestType)requestTag
{
[HIHTTPRequestManager.manager cancelTask:requestTag];
}
@end
Base类
在Base类里统一处理回调,然后根据不同的requestTag来区分是哪个请求的回调。而且还可以将URLString,parameters全都回调回来。
一般如果网网络请求在Model层处理的话,创建一个BaseModel,里面应该有一个HIHTTPRequest的引用,并遵循HIHTTPRequestDelegate,再提供一个发请求的方法就可以了。
通过访问Model的API,间接的访问到HIHTTPRequest的请求API,等请求返回到Model层后,再将返回结果处理成代理的形式返回。
将请求放倒Controller层的做法也是一样的,在BaseController里处理就可以了。一般建议放Model层处理。
HIBaseModel.h
@interface HIBaseModel : NSObjct <HIHTTPRequestDelegate>
#pragma mark - HTTP request
/// HTTP. Use getWithRequestTag:page:URLString:parameters to send a http request.
///
/// Overwrite the HIHTTPRequestDelegate method in child class and receiving the response.
// Use this function to send a get request.
- (void)getWithRequestTag:(HIHttpRequestType)requestTag
page:(Class)aClass
URLString:(NSString *)URLString
parameters:(nullable id)parameters;
// cancel a request, cancel the request when dismiss before controller.
- (void)cancelTask:(HIHttpRequestType)requestTag;
@end
HIBaseModel.m
@interface HIBaseModel ()
@property (nonatomic, strong) HIHTTPRequest *httpRequrst;
@end
@implementation HIBaseModel
#pragma mark - HTTP request
/// HTTP. Use getWithRequestTag:page:URLString:parameters to send a http request. Overwrite the requestFinished:page:URLString:parameters:success: and etc... to receiving the response.
- (HIHTTPRequest *)httpRequrst {
if (!_httpRequrst) {
_httpRequrst = [[HIHTTPRequest alloc] init];
}
return _httpRequrst;
}
- (void)getWithRequestTag:(HIHttpRequestType)requestTag
page:(Class)aClass
URLString:(NSString *)URLString
parameters:(nullable id)parameters
{
self.httpRequrst.delegate = self;
[self.httpRequrst getWithRequestTag:requestTag page:aClass URLString:URLString parameters:parameters];
}
- (void)cancelTask:(HIHttpRequestType)requestTag
{
[HIHTTPRequest cancelTask:requestTag];
}
#pragma mark - HIHTTPRequestDelegate
- (void)requestStared:(HIHttpRequestType)requestTag page:(Class)aClass URLString:(NSString *)URLString parameters:(nullable id)parameters
{
}
- (void)requestProgressing:(HIHttpRequestType)requestTag page:(Class)aClass URLString:(NSString *)URLString parameters:(nullable id)parameters progress:(NSProgress *)progress
{
}
- (void)requestFinished:(HIHttpRequestType)requestTag page:(Class)aClass URLString:(NSString *)URLString parameters:(nullable id)parameters success:(id)result
{
}
- (void)requestFailed:(HIHttpRequestType)requestTag page:(Class)aClass URLString:(NSString *)URLString parameters:(nullable id)parameters failure:(NSError *)error
{
}
@end
给每个Controller创建一个属于自己的Model,继承HIBaseModel,在Model层处理请求结果,最后将处理好的模型或者其他结果返回到Controller层来刷新UI显示。
这样做的好处就是请求、处理数据和业务从Controller层分离开处理了,不好处就是层级比较深,代码写的多,比较麻烦。
思路就是这么个思路,处理起来怎么方便怎么来。我自己感觉如果项目里使用AF能不用代理回调就别用代理,比较麻烦。如果用了代理回掉请求的话在BaseModel层处理比较麻烦,如果用还不如直接在BaseController来处理回调,将回调结果在发到Model层,Model处理完数据后再刷新UI显示。
这是在子Controller里面实现代理方法,在这里可以将需要统一处理的吐司,弹窗什么的放在BaseController统一处理,每个子控制器单独处理自己的业务。
#pragma mark - AF HTTP
- (void)requestStared:(HIHttpRequestType)requestTag page:(Class)aClass URLString:(NSString *)URLString parameters:(id)parameters
{
[self showProgressViewWithMessage:@"Initializing..." lockActions:YES];
}
- (void)requestFinished:(HIHttpRequestType)requestTag page:(Class)aClass URLString:(NSString *)URLString parameters:(id)parameters success:(id)result
{
[super requestFinished:requestTag page:aClass URLString:URLString parameters:parameters success:aClass];
// 这里可以将请求结果发送到Model层来处理数据,数据处理完后返回到业务层,再进行其他业务处理即可。
switch (requestTag) {
case xxx
{
}
break;
default:
break;
}
}
- (void)requestFailed:(HIHttpRequestType)requestTag page:(Class)aClass URLString:(NSString *)URLString parameters:(id)parameters failure:(NSError *)error
{
[super requestFailed:requestTag page:aClass URLString:URLString parameters:parameters failure:error];
switch (requestTag) {
case xxx:
{
}
break;
default:
break;
}
}
相关阅读:
规范使用AFNetworking(二)