SSJNetWork
SSJNetWork copied to clipboard
对AFNetWorking 二次封装 实现自动取消网络请求,网络请求缓冲,网络请求日志详细打印(代码还有不成熟的地方,如使用请下载到本地使用,如果问题,好及时修改)
SSJNetWork
对AFNetWorking 二次封装 实现自动取消网络请求,网络请求缓冲,网络请求日志详细打印
特性
- 支持缓存写入模式、读取模式、有效时长等自定义配置 (同时享有来着 YYCache 的优越性能)
- 支持按版本号缓存网络请求内容
- 支持按时间缓存网络请求内容
- 自动取消网络请求
- 支持 Block 回调方式
- 代码层级简单,便于功能拓展 -使用NetworkEye记录网络请求和请求日志
安装
第一种方式:
- 下载 SSJNetWork 文件夹所有内容并且拖入你的工程中。
第二种方式: pod 'SSJNetWork'
请pod导入这些依赖库
pod 'YYCache'
pod 'FMDB/SQLCipher', '~> 2.5'
pod 'AFNetworking', '~>3.1.0'
用法
可下载 DEMO 查看示例。
基本使用
1、第一步
请配置SJNetWorkConfig参数
2、第二步
####第一种封装方式
封装SJApiRequestManager如demo中: NSObject (SJNetWork)
//封装post请求
- (void)POST:(NSString *)URLString parameters:(id)parameter completion:(void (^)(NSError * _Nonnull, id _Nonnull))completion {
SJNetworkRequestConfig *config = [[SJNetworkRequestConfig alloc] init];
config.method = @"POST";
config.urlString = URLString;
config.params = parameter;
[self networkRequestConfig:config completion:completion];
}
//封装get请求
- (void)GET:(NSString *)URLString parameters:(id)parameter completion:(void (^)(NSError * _Nonnull, id _Nonnull))completion {
SJNetworkRequestConfig *config = [[SJNetworkRequestConfig alloc] init];
config.method = @"GET";
config.urlString = URLString;
config.params = parameter;
[self networkRequestConfig:config completion:completion];
}
//封装自定义参数请求
- (void)networkRequestConfig:(SJNetworkRequestConfig *)config completion:(void (^)(NSError * _Nonnull, id _Nonnull))completion {
config.className = NSStringFromClass(self.class);
[[SJApiRequestManager requestManager] sj_networkRequestConfig:config completion:^(NSError * _Nonnull error, id _Nonnull responseObject) {
//一些错误提示处理
if (error.code == SJApiManagerErrorTypeNoNetWork) {
//错误提示
} else if (error.code == SJApiManagerErrorTypeTimeOut) {
//错误提示
}
if (completion) {
completion(error,completion);
}
}];
//第二种封装方式
@implementation SXRequestService
- (void)POST:(NSString *)URLString parameters:(id)parameter className:(NSString *)clsName completion:(void (^)(NSError * _Nonnull, id _Nonnull))completion {
[self method:@"POST" ClassName:clsName urlsString:URLString parameters:parameter completion:completion];
}
- (void)GET:(NSString *)URLString parameters:(id)parameter className:(NSString *)clsName completion:(void (^)(NSError * _Nonnull, id _Nonnull))completion {
[self method:@"GET" ClassName:clsName urlsString:URLString parameters:parameter completion:completion];
}
- (void)method:(NSString *)method ClassName:(NSString *)className urlsString:(NSString *)urlString parameters:(id)parameters completion:(void (^)(NSError * _Nonnull, id _Nonnull))completion {
SJNetworkRequestConfig *requestConfig = [[SJNetworkRequestConfig alloc] init];
equestConfig.method = method;
requestConfig.className = className;
requestConfig.urlString = urlString;
requestConfig.params = parameters;
[self networkRequestConfig:requestConfig completion:completion];
}
- (void)networkRequestConfig:(SJNetworkRequestConfig *)config completion:(void (^)(NSError * _Nonnull, id _Nonnull))completion {
[[SJApiRequestManager requestManager] sj_networkRequestConfig:config completion:^(NSError * _Nonnull error, id _Nonnull responseObject) {
//一些错误提示处理
if (error.code == SJApiManagerErrorTypeNoNetWork) {
//错误提示
} else if (error.code == SJApiManagerErrorTypeTimeOut) {
//错误提示
}
if (completion) {
completion(error,completion);
}
}];}
@end
第一种的比第二种的优势在于不用传className(类名),和初始化,具体使用那种,请开发者自行选择
3、第三步
封装每个类对应的serice处理网络各自的网络请求 如demo中:
#define kHomeUrl @"https://news-at.zhihu.com/api/4/news/9710114"
@interface SJHomeRequestService ()
@property (nonatomic, assign) SJHomeViewController *vc;
@end
@implementation SJHomeRequestService
- (instancetype)initWitHomeVC:(SJHomeViewController *)vc {
if (self = [super init]) {
self.vc = vc;
}
return self;
}
- (void)getHomeRequestUserId:(NSString *)userId completion:(nonnull void (^)(NSError * _Nonnull, id _Nonnull))completion{
//
// NSMutableDictionary *params = [NSMutableDictionary dictionaryWithCapacity:1];
// [params setObject:userId forKey:@"userId"]
[self.vc GET:kHomeUrl parameters:nil completion:^(NSError * _Nonnull error, id _Nonnull responseObject) {
//转化成对应的模型回调
if (completion) {
completion(error,responseObject);
}
}];
}
@end
3、第四步
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self setupConfigurator];
[self loadData];
}
- (void)setupConfigurator {
_requestService = [[SJHomeRequestService alloc] initWitHomeVC:self];
}
- (void)loadData {
/ /回调什么具体可以自己在block里面定义
[_requestService getHomeRequestUserId:@"123" completion:^(NSError * _Nonnull error, id _Nonnull responseObject) {
NSLog(@"请求数据成功");
}];;
}
缓存处理
缓存处理配置都在SJNetWorkConfig和SJNetworkRequestConfig类中,支持以下配置:
- 内存/磁盘存储方式
- 缓存的有效时长
- 根据请求shouldAllIgnoreCache判断是否需要缓存
- 以及直接配置 YYCache
- 支持缓冲最大数量(采用YYCache LRU算法)
- 缓存的版本
自动取消网络请求
采用AOP hook方式自动取消网络请求
swizzling_exchangeMethod([self class],@selector(popViewControllerAnimated:), @selector(ssj_popViewControllerAnimated:));
swizzling_exchangeMethod([self class],@selector(popToRootViewControllerAnimated:), @selector(ssj_popToRootViewControllerAnimated:));
swizzling_exchangeMethod([self class],@selector(popToViewController:animated:), @selector(ssj_popToViewController:animated:));
swizzling_exchangeMethod([self class],@selector(dismissViewControllerAnimated:completion:), @selector(ssj_dismissViewControllerAnimated:completion:));
请配置 SJNetworkRequestConfigz 中 className 如不传入参数网络请求对应vc的className,则自动取消网络请求无效 自动取消网络请求根据的的是,视图pop和dismiss的时候取消当前VC下所有的网络请求设计的 (具体实现可参照demo种:NSObject+SSJNetWork 和SSJRequestService 任选一种)
Log日志打印和Log日志Sql记录
SJNetWorkConfig
变量配置,
dubugLogeEnable:请求完成控制台直接输出 SQLLogEnable:记录在sql提高跳转到vc的时候展示 ne_sqlitePassword:log日志数据库密码 ne_saveRequestMaxCount:保存请求的最大个数
参考源码:YTKNetwork CTNetworking