iOS 开发中,无非就是界面搭建以及数据配置 .今天我们就对我们常用的第三方请求类AFNetworking 再进行简单的封装.让我们的代码书写更加简洁.耦合性更低!
如果你想了解并使用常用控件的封装,请参考我的另一篇博客文章iOS 常用控件的封装以及调用.
大家知道, AF 其实已经是对数据请求类的封装了,但是我们在项目中用到最多的 get 或 post 请求 .不能每次都把 AF 的方法都写一遍把,显得代码累赘,也让开发过程显得枯燥!这时,我们可以单独封装出来一个请求类,使用中就如同调用系统的一个协议方法那样简单,同样做到数据请求需求! 不多说,下面看代码:
首先需要 cocoapods 集成 AFNetworking(这个步骤就不用多说了). 创建一个数据请求类 继承NSObject
//如果你想统一的加入缓存圈,你也可以在工程中集成 SVProgressHUD并导入头文件.
如下: .h 文件中我们创建了两个方法 get 和 post 方法
#import
#import
#import
@interface SL_AFNetworking : NSObject
/*------ 批注 ------*
///本整理内容需要导入第三方库: AFNetworking / SVProgressHUD
* get请求 并通过block返回json数据
* URLString ----> 网络地址
* parameters ----> 参数请求体
* success ----> 请求成功
* failure ----> 请求失败
*/
//创建get请求
+(void)SL_NetworkingForGET:(nullable NSString *)URLString parameters:( nullable NSDictionary *)parameters success:(nullablevoid(^)(id_Nonnull json))success failure:(nullablevoid(^)(NSURLSessionDataTask *_Nullable task,NSError *_Nonnull error))failure;
//创建post请求
+(void)SL_NetworkingForPOST:(nullable NSString *)URLString parameters:( nullable NSDictionary *)parameters success:(nullablevoid(^)(id_Nonnull json))success failure:(nullablevoid(^)(NSURLSessionDataTask *_Nullable task,NSError *_Nonnull error))failure;
@end
接下来我们跳到. m 文件中实现这两个方法:
#import "SL_AFNetworking.h"
@implementation SL_AFNetworking
//实现单例请求类对象
+(AFHTTPSessionManager *)shareManager;
{
static AFHTTPSessionManager * manager;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager =[AFHTTPSessionManager manager];
manager.responseSerializer.acceptableContentTypes =[NSSet setWithObjects:@"application/json",@"text/json",@"text/javascript",@"text/html",@"text/plain",nil];
[manager.requestSerializer willChangeValueForKey:@"timeoutInterval"];
manager.requestSerializer.timeoutInterval = 15.f;
[manager.requestSerializer didChangeValueForKey:@"timeoutInterval"];
});
return manager;
}
+(AFHTTPSessionManager *)manager;
{
AFHTTPSessionManager * manager =[AFHTTPSessionManager manager];
manager.securityPolicy.allowInvalidCertificates =true;
return manager;
}
//创建get请求
+(void)SL_NetworkingForGET:(nullable NSString *)URLString parameters:( nullable NSDictionary *)parameters success:(nullablevoid(^)(id_Nonnull json))success failure:(nullablevoid(^)(NSURLSessionDataTask *_Nullable task,NSError *_Nonnull error))failure;
{
//字符串处理
NSString * string =[URLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:URLString]];
[SVProgressHUD showWithStatus:@"数据加载中... "];
//数据请求
[[SL_AFNetworking shareManager]GET:string parameters:parameters progress:^(NSProgress *_Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task,id _Nullable responseObject) {
[SVProgressHUD dismiss];
if (success) {
// --- > 字典类型 --- > json数据 --- >解析数据并传值
NSError * error =nil;
if (error !=nil) {
[SVProgressHUD showErrorWithStatus:@"数据解析失败,请稍后尝试!"];
return ;
}
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError *_Nonnull error) {
[SVProgressHUD showErrorWithStatus:@"请求数据失败,请检查网络后重试!"];
if (failure) {
failure(task,error);
}
}];
}
//创建post请求
+(void)SL_NetworkingForPOST:(nullable NSString *)URLString parameters:( nullable NSDictionary *)parameters success:(nullablevoid(^)(id_Nonnull json))success failure:(nullablevoid(^)(NSURLSessionDataTask *_Nullable task,NSError *_Nonnull error))failure;
{
//字符串处理
NSString * string =[URLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:URLString]];
[SVProgressHUD showWithStatus:@"数据加载中... "];
[[SL_AFNetworking shareManager]POST:string parameters:parameters progress:^(NSProgress *_Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task,id _Nullable responseObject) {
[SVProgressHUD dismiss];
if (success) {
// --- > 字典类型 --- > json数据 --- >解析数据并传值
NSError * error =nil;
if (error !=nil) {
[SVProgressHUD showErrorWithStatus:@"数据解析失败,请稍后尝试!"];
return ;
}
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError *_Nonnull error) {
[SVProgressHUD showErrorWithStatus:@"请求数据失败,请检查网络后重试!"];
if (failure) {
failure(task,error);
}
}];
}
@end
代码整理还不够完善,如果有好的建议,请在下边留言, 如果对文章感兴趣,欢迎关注小白博客或加入公共讨论群: 234713941