SSJNetWork
对AFNetWorking 二次封装 实现自动取消网络请求,网络请求缓冲,网络请求日志详细打印(代码还有不成熟的地方,如使用请下载到本地使用,如果问题,好及时修改)
Install / Use
/learn @sunjie19921111/SSJNetWorkREADME
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
Related Skills
node-connect
344.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
96.8kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
344.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
344.1kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
