Arclin

Advocate Technology. Enjoy Technology.

0%

网络层方法封装

网络层的方法封装

特点

  • 集成AFNetworking
  • 集成MJExtension
  • 统一回调
  • 方便顶层调用
  • 统一错误处理
  • 适应接口设计

设计(以POST和退出登录接口举例)

  1. 接口设计
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    typedef void (^DKResponseBlock)(DKResponse *response);

    + (void)POST:(nonnull NSString *)URLString parameters:(nullable id)parameters success:(nonnull DKResponseBlock)callBack;
    1.1 DKResponse 回调模型设计(根据接口进行设计)


    #import <Foundation/Foundation.h>

    @interface DKResponse : NSObject

    /** state */
    @property (nonatomic,copy) NSString *state;

    /** result */
    @property (nonatomic,copy) NSDictionary *result;

    /** message */
    @property (nonatomic,copy) NSString *message;

    /** 纯数据 */
    @property (nonatomic, strong) id rawData;

    /** error */
    @property (nonatomic,copy) NSError *error;

    @end
  2. 底层方法实现
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    (DKConfiguration.h 或者使用 plist)
    static NSString *kDKTimeoutInterval = 10.0f;
    static NSString *kDKSuccessMessage = @"success";

    + (void)POST:(nonnull NSString *)URLString parameters:(nullable id)parameters callBack:(nonnull DKResponseBlock)callBack {
    AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
    mgr.requestSerializer.timeoutInterval = kDKTimeoutInterval;
    [mgr POST:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
    DKResponse *resp = [DKResponse mj_objectWithKeyValues:responseObject]; // 转为响应信息模型
    resp.rawData = responseObject; // 储存源数据
    if(callBack){
    if (![resp.message isEqualToString:kDKSuccessMessage]) { // 判断是否是成功的
    resp.error = [NSError errorWithDomain:@"dankal.cn" code:[resp.state integerValue] userInfo:@{@"message":resp.message}]; // 生成错误对象
    callBack(resp);
    }else{
    callBack(resp); // 没有错误直接返回
    }
    }

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    DKLog(@"%@",error);
    DKResponse *response = [[DKResponse alloc] init]; // 随便看看
    response.error = error;
    if(callBack){
    callBack(response);
    }
    }];
    }
  3. 业务层接口设计
    1
    2
    3
    4
    5
    6
    7
    8
    (DKLogin.h)
    typedef void (^DKBlockSuccessOrError)(BOOL isSuccessful,NSError *error);
    // 其他需求可以定制其他回调,如下
    typedef void (^DKArrayResultBlock)(NSArray *result,NSError *error);
    typedef void (^DKIntegerResultBlock)(NSInteger number, NSError *error) ;
    typedef void (^DKUserResultBlock)(DKUser *user, NSError *error); // DKUser为模型

    + (void)logout:(DKBlockSuccessOrError)callBack;
  4. 业务层接口实现
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    + (void)logout:(DKBlockSuccessOrError)callBack
    {
    NSString *url = @"xxxx";
    NSDictionary *params = @{@"xxx":@"xxx"};
    [DKHTTPTool POST:url parameters:params success:^(DKResponse *response) {
    if (callBack) {
    response.error ? callBack(NO,response.error) : callBack(YES,nil);
    }
    }];
    }
  5. ViewModel 或 ViewController 调用
    1
    2
    3
    4
    5
    6
    7
    [DKLoginService logout:^(BOOL isSuccess,NSError *error){
    if(isSuccess){

    }else{

    }
    }];