网络层的方法封装
特点
- 集成AFNetworking
- 集成MJExtension
- 统一回调
- 方便顶层调用
- 统一错误处理
- 适应接口设计
设计(以POST和退出登录接口举例)
- 接口设计
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
26typedef void (^DKResponseBlock)(DKResponse *response);
+ (void)POST:(nonnull NSString *)URLString parameters:(nullable id)parameters success:(nonnull DKResponseBlock)callBack;
1.1 DKResponse 回调模型设计(根据接口进行设计)
@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 - 底层方法实现
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);
}
}];
} - 业务层接口设计
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; - 业务层接口实现
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);
}
}];
} - ViewModel 或 ViewController 调用
1
2
3
4
5
6
7[DKLoginService logout:^(BOOL isSuccess,NSError *error){
if(isSuccess){
}else{
}
}];