AF Http request 代理形式回调

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(二)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morris_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值