前言
最近刚做完一个项目,整理一下项目里面可以复用的东西,今天先拿里面的网络框架来说
XDNetworking
基于AFNetworking3.0封装网络请求功能,API面向业务层更友好,基础功能包括GET、POST、下载、单文件上传、多文件上传、取消网络请求。此外拓展出缓存功能,缓存分为内存缓存和磁盘缓存。
目录结构
将cache相关的东西抽离为了方便日后拓展
缓存实现
内存缓存用NSCache实现,磁盘缓存用文件缓存实现
使用
将XDNetworking包拉进工程
1
| #import "XDNetworking.h"
|
GET请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| /**
* GET请求
*
* @param url 请求路径
* @param cache 是否缓存
* @param params 拼接参数
* @param progressBlock 进度回调
* @param successBlock 成功回调
* @param failBlock 失败回调
*
* @return 返回的对象中可取消请求
*/
+ (XDURLSessionTask *)getWithUrl:(NSString *)url
cache:(BOOL)cache
params:(NSDictionary *)params
progressBlock:(XDGetProgress)progressBlock
successBlock:(XDResponseSuccessBlock)successBlock
failBlock:(XDResponseFailBlock)failBlock;
|
POST请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| /**
* POST请求
*
* @param url 请求路径
* @param cache 是否缓存
* @param params 拼接参数
* @param progressBlock 进度回调
* @param successBlock 成功回调
* @param failBlock 失败回调
*
* @return 返回的对象中可取消请求
*/
+ (XDURLSessionTask *)postWithUrl:(NSString *)url
cache:(BOOL)cache
params:(NSDictionary *)params
progressBlock:(XDPostProgress)progressBlock
successBlock:(XDResponseSuccessBlock)successBlock
failBlock:(XDResponseFailBlock)failBlock;
|
下载请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| /**
* 文件下载
*
* @param url 下载文件接口地址
* @param progressBlock 下载进度
* @param successBlock 成功回调
* @param failBlock 下载回调
*
* @return 返回的对象可取消请求
*/
+ (XDURLSessionTask *)downloadWithUrl:(NSString *)url
progressBlock:(XDDownloadProgress)progressBlock
successBlock:(XDDownloadSuccessBlock)successBlock
failBlock:(XDDownloadFailBlock)failBlock;
|
文件上传
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| /**
* 文件上传
*
* @param url 上传文件接口地址
* @param data 上传文件数据
* @param type 上传文件类型
* @param name 上传文件服务器文件夹名
* @param mimeType mimeType
* @param progressBlock 上传文件路径
* @param successBlock 成功回调
* @param failBlock 失败回调
*
* @return 返回的对象中可取消请求
*/
+ (XDURLSessionTask *)uploadFileWithUrl:(NSString *)url
fileData:(NSData *)data
type:(NSString *)type
name:(NSString *)name
mimeType:(NSString *)mimeType
progressBlock:(XDUploadProgressBlock)progressBlock
successBlock:(XDResponseSuccessBlock)successBlock
failBlock:(XDResponseFailBlock)failBlock;
|
多文件上传
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| /**
* 多文件上传
*
* @param url 上传文件地址
* @param datas 数据集合
* @param type 类型
* @param name 服务器文件夹名
* @param mimeType mimeTypes
* @param progressBlock 上传进度
* @param successBlock 成功回调
* @param failBlock 失败回调
*
* @return 任务集合
*/
+ (NSArray *)uploadMultFileWithUrl:(NSString *)url
fileDatas:(NSArray *)datas
type:(NSString *)type
name:(NSString *)name
mimeType:(NSString *)mimeTypes
progressBlock:(XDUploadProgressBlock)progressBlock
successBlock:(XDMultUploadSuccessBlock)successBlock
failBlock:(XDMultUploadFailBlock)failBlock;
|
取消所有网络请求
1
| + (void)cancleAllRequest;
|
取消单个请求
1
| + (void)cancelRequestWithURL:(NSString *)url;
|
获取缓存大小
1
2
3
4
5
6
| /**
* 获取缓存大小
*
* @return 缓存大小
*/
+ (unsigned long long)totalCacheSize;
|
清理缓存
1
2
3
4
| /**
* 清除所有缓存
*/
+ (void)clearTotalCache;
|
自动清理缓存
1
2
3
4
| //每次网络请求的时候,检查此时磁盘中的缓存大小,如果超过阈值,则清理所有缓存
//未来优化点:1、这里到时会做进一步优化,到时会有两种清理策略,一种基于时间维度,一种基于缓存大小,
// 2、清理也不会清理全部,会采取LRU算法来淘汰在磁盘中价值最低的缓存
if ([self totalCacheSize] > CACHEMAXSIZE) [self clearTotalCache];
|
使用Tip
1.
对于cache与否,到时大家针对自己的业务数据的特征来决定是否开启cache,即时性或时效性的数据建议不开启缓存,一般建议开启,开启缓存后会回调两次,第一次获取是缓存数据,第二次获取的是最新的网络数据;
2.
具体使用的时候,建议面向业务层再封装一次Service层或者将网络请求写进MVVM的viewModel中,向controller暴露只面向业务的参数。
未来拓展
1.
为缓存添加相应的缓存淘汰算法LRU;
2.
添加请求缓存策略;
3.
再封装面向业务更友好的manager,管理业务层的API,使其方便在不同网络环境下切换(测试环境与正式环境……)
github地址
https://github.com/caixindong/XDNetworking
大家觉得喜欢就赏个star,有什么问题可以issue我或者在评论指出,相互学习