TestsTested | ✗ |
LangLanguage | Obj-CObjective C |
License | MIT |
ReleasedLast Release | Nov 2016 |
Maintained by AbooJan.
Depends on: | |
AFNetworking | >= 0 |
MJExtension | >= 0 |
SPTPersistentCache | >= 0 |
AFNetworking 3.0 版本的封装,结合MJExtension框架处理JSON序列化问题
项目中使用的网络请求服务器代码使用 Node.js
编写:NetworkTest
pod 'AJNetworking'
全局网络配置,需要使用类 AJNetworkConfig
在 AppDelegate
中配置.
/// 服务器域名
@property (nonatomic, copy) NSString *hostUrl;
/// HTTPS 证书密码
@property (nonatomic, assign) CFStringRef httpsCertificatePassword;
/// HTTPS 证书路径
@property (nonatomic, copy) NSString *httpsCertificatePath;
新建一个请求类继承自 AJRequestBeanBase
, 一个响应类继承自 AJResponseBeanBase
。
命名规则
请求类:
RequestBean
+业务名称
响应类:
ResponseBean
+业务名称
默认请求类跟响应类的
业务名称
必须相同例如一个登录请求,请求类为:
RequestBeanLogin
, 响应类为:ResponseBeanLogin
如果请求类实现了方法:
- (NSString *)responseBeanClassName
, 则可以自定义响应类,名称可以不同,但依然需要继承自AJResponseBeanBase
类。
请求类里面的成员变量即为发起请求的入参,响应类里面的成员变量即为返回参数。
请求类需要遵循协议:AJRequestBeanProtocol
. 响应类需要遵循协议:AJResponseBeanProtocol
网络请求的相关配置通过实现协议 AJRequestBeanProtocol
的方法。
发起请求由类 AJNetworkManager
管理,里面负责网络的请求和返回数据的处理,示例:
RequestBeanDemoRegister *requestBean = [RequestBeanDemoRegister new];
requestBean.userName = self.userNameTF.text;
requestBean.pw = self.pwTF1.text;
[AJNetworkManager requestWithBean:requestBean callBack:^(__kindof AJResponseBeanBase * _Nullable responseBean, AJError * _Nullable err) {
if (!err) {
// 结果处理
ResponseBeanDemoRegister *response = responseBean;
AJLog(@"userId:%@", response.data.userId);
}
}];
请求类需要实现协议 AJRequestBeanProtocol
中的方法, 这个参考了 YTKNetwork
框架:
/**
* @author aboojan
*
* @brief 当POST的内容带有文件等富文本时使用
*
* @return MultipartFormData Block
*/
- (AFConstructingBlock)constructingBodyBlock;
方法实现示例:
- (AFConstructingBlock)constructingBodyBlock
{
NSData *data = UIImageJPEGRepresentation(self.avatar, 0.8);
NSString *name = @"img";
NSString *formKey = @"img";
NSString *type = @"applicaton/octet-stream";
return AJConstructingBlockDefine {
[formData appendPartWithFileData:data name:formKey fileName:name mimeType:type];
};
}
文件上传请求示例,跟发起普通请求一样:
RequestBeanUploadAvatar *requestBean = [[RequestBeanUploadAvatar alloc] init];
requestBean.compid = @"1702487";
requestBean.avatar = [UIImage imageNamed:@"testImg"];
[AJNetworkManager requestWithBean:requestBean callBack:^(__kindof AJResponseBeanBase * _Nullable responseBean, AJError * _Nullable err) {
if (!err) {
ResponseBeanUploadAvatar *response = responseBean;
}
}];
文件下载跟普通请求不同,需要使用类 AJNetworkManager
中的以下方法:
/**
* @author aboojan
*
* @brief 文件下载
*
* @param requestBean 文件下载请求Bean
* @param progressCallBack 下载进度回调
* @param completionCallBack 完成回调
*
* @return 当前下载任务线程
*/
+ ( NSURLSessionDownloadTask * _Nullable )downloadTaskWithBean:(__kindof RequestBeanDownloadTaskBase * _Nonnull)requestBean progress:(AJDownloadProgressCallBack _Nullable )progressCallBack completion:(AJDownloadCompletionCallBack _Nullable)completionCallBack;;
文件下载请求类使用 RequestBeanDownloadTaskBase
,使用示例:
RequestBeanDownloadTaskBase *downloadRequest = [[RequestBeanDownloadTaskBase alloc] init];
downloadRequest.fileUrl = @"http://temp.26923.com/2016/pic/000/378/032ad9af805a8e83d8323f515d1d6645.jpg";
downloadRequest.saveFileName = @"desktop.jpg";
downloadRequest.saveFilePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
[AJNetworkManager downloadTaskWithBean:downloadRequest progress:^(int64_t totalUnitCount, int64_t completedUnitCount, double progressRate) {
AJLog(@"下载进度:%lf", progressRate);
} completion:^(NSURL *filePath, NSError *error) {
if (error) {
AJLog(@"下载失败:%@", [error description]);
}else{
AJLog(@"下载成功:%@", [filePath description]);
}
}];
下载任务控制, 通过下载请求返回的 NSURLSessionDownloadTask
实例来处理。
// 暂停任务
[self.downloadTask suspend];
// 继续下载
[self.downloadTask resume];
// 取消下载
[self.downloadTask cancel];
读取已缓存数据跟发起普通请求类似,使用 AJNetworkManager
的以下方法:
/**
* @author aboojan
*
* @brief 读取缓存
*
* @param requestBean 请求Bean
* @param callBack 读取缓存回调
*/
+ (void)cacheWithRequestWithBean:(__kindof AJRequestBeanBase * _Nonnull)requestBean callBack:(AJRequestCallBack _Nonnull)callBack
如果要缓存请求数据,需要请求类实现协议 AJRequestBeanProtocol
的以下方法:
/**
* @author aboojan
*
* @brief 是否缓存请求结果,默认不缓存
*
* @return YES,缓存;NO,不缓存
*/
- (BOOL)cacheResponse;
默认缓存是长期有效的,如果需要控制缓存的有效时间,需要请求类实现协议 AJRequestBeanProtocol
的以下方法:
/**
* @author aboojan
*
* @brief 缓存有效时间,单位为秒, 默认为0,即长期有效;
*
* @return 有效时间
*/
- (NSUInteger)cacheLiveSecond;
发起请求的时候可以先读取缓存,当缓存不存在或已失效的时候才真正发起请求:
[AJNetworkManager cacheWithRequestWithBean:requestBean callBack:^(__kindof AJResponseBeanBase * _Nullable responseBean, AJError * _Nullable err) {
if (!err) {
// 读取缓存
[self handleReponse:response];
}else{
// 发起网络请求
[self readFromNetwork];
}
}];
目前已把缓存和网络请求结合在了一起,如果设置的是短期缓存,在有效期内不会发起真正的网络请求;如果是长期有效缓存,则会先读取缓存,然后发起网络请求。使用详情可以参考Demo
/**
* @author aboojan
*
* @brief 发起网络请求,有缓存
*
* @param requestBean 网络请求参数模式Bean
* @param cacheCallBack 缓存读取回调
* @param httpCallBack 网络请求结果回调
*/
+ (void)requestWithBean:(__kindof AJRequestBeanBase * _Nonnull)requestBean
cacheCallBack:(AJRequestCallBack _Nonnull)cacheCallBack
httpCallBack:(AJRequestCallBack _Nonnull)httpCallBack;
缓存配置类 AJCacheOptions
, 提供3个可选配置项:
/**
* @author aboojan
*
* @brief 缓存存放路径
*/
@property (nonatomic, copy) NSString *cachePath;
/**
* @author aboojan
*
* @brief 是否开启缓存自动回收,默认关闭
*/
@property (nonatomic,assign) BOOL openCacheGC;
/**
* @author aboojan
*
* @brief 缓存过期时间,最小不能小于60s
*/
@property (nonatomic, assign) NSUInteger globalCacheExpirationSecond;
/**
* @author aboojan
*
* @brief 缓存自动回收时间,最小不能小于60s
*/
@property (nonatomic, assign) NSUInteger globalCacheGCSecond;
缓存配置跟网络配置一样,通过类 AJNetworkConfig
类设置,例如:
AJCacheOptions *cacheOptions = [AJCacheOptions new];
cacheOptions.cachePath = [documentsPath stringByAppendingPathComponent:@"aj_network_cache"];
cacheOptions.openCacheGC = YES;
cacheOptions.globalCacheExpirationSecond = 60;
cacheOptions.globalCacheGCSecond = 2 * 60;
networkConfig.cacheOptions = cacheOptions;
通过类 AJNetworkStatus
获取当前网络状态,框架本身在网络配置完之后即开启网络监测。
- (AJNetworkReachabilityStatus)currentStatus;
- (BOOL)canReachable;
在 RequestBean
中实现以下方法
/**
* @author aboojan
*
* @brief 是否需要显示Loading,默认不显示
*
* @return YES,显示;NO,不显示
*/
- (BOOL)isShowHub;
/**
* @author aboojan
*
* @brief Hub提示文案,isShowHub设置为YES时才会生效
*
@return 提示文案
*/
- (NSString *)hubTips;
通过类 AJNetworkConfig
类设置 hubDelegate
,然后在 delegate
中实现hub的显示。
/**
* 显示Hub
*
@param tip hub文案
*/
- (void)showHub:(nullable NSString *)tip;
/**
* 隐藏Hub
*/
- (void)dismissHub;
AJNetworkManager
类的以下方法实现结束网络请求任务/**
根据 taskKey 结束目标网络请求任务
@param taskKeyArray 任务Key数组
*/
+ (void)stopRequestTaskWithTaskKey:(NSArray<__kindof NSString *> * _Nonnull)taskKeyArray
继承自 AJRequestBeanBase
请求数据Bean新增了一个获取 taskKey
的成员变量,在Bean赋值后可以获取。
这样可以在控制器基类中暴露一个存放 taskKey
的数组,然后在通用的页面关闭方法或 dealloc
方法中把网络请求结束掉,减少资源占用。
依赖框架 |
---|
AFNetwoking |
MJExtension |
SPTPersistentCache |