YTKNetwork
YTK基本思想是把每一个网络请求封装成对象。把每一个网络请求封装成对象模式也就是设计模式-Command模式
特性
-
支持统一配置服务器和CDN的地址
-
支持按时间缓存网络请求内容
-
支持相互依赖的网络请求的发送
-
支持检查JSON内容的合法性
YTK源码结构
YTKBaseRequest
YTKRequest的父类,定义了Request的相关属性,Block和Delegate。给对外接口默认的实现,以及公共逻辑。
YTKRequest
主要对缓存做处理,更新缓存、读取缓存、手动写入缓存,是否忽略缓存。这里采用归档形式缓存,请求方式、根路径、请求地址、请求参数、app版本号、敏感数据拼接再MD5作为缓存的文件名,保证唯一性。还提供设置缓存的保存时长,主要实现是通过获取缓存文件上次修改的时刻距离现在的时间和设置的缓存时长作比较,来判断是否真正发起请求,下面是发起请求的一些逻辑判断:
YTKNetworkAgent
真正发起网络请求的类,在addRequest方法里调用AFN的方法,这块可以方便的更换第三方库,还包括一些请求取消,插件的代理方法调用等,所有网络请求失败或者成功都会调用下面这个方法
YTKNetworkConfig
配置请求根路径、DNS地址
YTKNetworkPrivate:
工具类,拼接地址,提供加密方法,定义分类等。
YTKBatchRequest、YTKChainRequest
YKTNetwork的两个高级用法,批量网络请求和链式的网络请求,相当于一个存放Request的容器,先定义下面属性,finishedCount来记录批量请求的完成的个数:
XMNetworking
XMNetworking 是一个轻量的、简单易用但功能强大的网络库,基于 AFNetworking 3.0 封装。
XMNetworking 采用中心化的设计思想,由 XMCenter 统一发起并管理所有的 XMRequest 请求,并可通过 XMCenter 给所有请求配置回调线程、公共 Server URL、Header、Parameter 等信息,同时也可以 Block 注入的方式实现自定义的响应结果处理逻辑,如数据模型转换、业务错误码判断、网络缓存等。
同时增加了 XMEgine 这一层是为了隔离底层第三方库依赖,便于以后切换其他底层网络库或自己实现底层逻辑
特性
- 简单易用,发送请求只需调用一个方法,通过 Block 配置信息,代码紧凑;
- 功能强大,适用于几乎所有的网络请求使用场景(普通请求、上传、下载)
- 支持批量请求、链式请求等复杂业务逻辑的网络需求;
- 全局配置所有请求的公共信息,自定义回调线程以及响应处理逻辑;
使用
全局网络配置
[XMCenter setupConfig:^(XMConfig *config) {
config.generalServer = @"公共服务端地址";
//公共请求头
config.generalHeaders = @{};
// 公共请求参数
config.generalParameters = @{@"general-parameter": @"general parameter value"};
// 公共用户信息
config.generalUserInfo = nil;
//请求的回调 Block 执行的 dispatch 队列(线程)
config.callbackQueue = dispatch_get_main_queue();
config.consoleLog = YES;
}];
发起请求
[XMCenter sendRequest:^(XMRequest *request) {
//可选,如果为空则读取 XMCenter.generalServer
request.server = @"http://example.com/v1/";
request.api = @"foo/bar";
//参数
request.parameters = @{@"param1": @"value1", @"param2": @"value2"};
// 可选,默认为 `POST`
request.httpMethod = kXMHTTPMethodPOST;
// 可选,默认为 `Normal`
request.requestType = kXMRequestNormal;
} onSuccess:^(id responseObject) {
NSLog(@"onSuccess: %@", responseObject);
} onFailure:^(NSError *error) {
NSLog(@"onFailure: %@", error);
}];
链式请求
这种请求方式其中有一个失败,则立即执行 failure Block
[XMCenter sendChainRequest:^(XMChainRequest *chainRequest) {
[[[[chainRequest onFirst:^(XMRequest *request) {
request.url = @"server url 1";
}] onNext:^(XMRequest *request, id responseObject, BOOL *sendNext) {
NSDictionary *params = responseObject;
if (params.count > 0) {
request.url = @"server url 2";
request.parameters = params;
} else {
*sendNext = NO;
}
}] onNext:^(XMRequest *request, id responseObject, BOOL *sendNext) {
request.url = @"server url 3";
request.parameters = @{@"param1": @"value1", @"param2": @"value2"};
}] onNext: ...];
} onSuccess:^(NSArray<id> *responseObjects) {
NSLog(@"onSuccess: %@", responseObjects);
} onFailure:^(NSArray<id> *errors) {
NSLog(@"onFailure: %@", errors);
} onFinished:^(NSArray<id> *responseObjects, NSArray<id> *errors) {
NSLog(@"onFinished");
}];
批量请求
支持同时发一组批量请求,这组请求在业务逻辑上相关,但请求本身是互相独立的,success block 会在所有请求都成功结束时才执行,而一旦有一个请求失败,则会执行 failure block。
[XMCenter sendBatchRequest:^(XMBatchRequest *batchRequest) {
XMRequest *request1 = [XMRequest request];
request1.url = @"server url 1";
XMRequest *request2 = [XMRequest request];
request2.url = @"server url 2";
[batchRequest.requestArray addObject:request1];
[batchRequest.requestArray addObject:request2];
} onSuccess:^(NSArray<id> *responseObjects) {
NSLog(@"onSuccess: %@", responseObjects);
} onFailure:^(NSArray<id> *errors) {
NSLog(@"onFailure: %@", errors);
} onFinished:^(NSArray<id> *responseObjects, NSArray<id> *errors) {
NSLog(@"onFinished");
}];