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 |