写在前面:对于移动端开发来说,无论iOS,Android,抑或是H5开发,所谓的开发核心之一就是从服务端接收数据,前端负责展示,所以,当然还有各种逻辑的实现,但是呢,一个完善的APP肯定是少不了与服务端交互的,所以一个网络请求类的封装好用与否直接关系到一个项目的开发效率以及后期的维护,本人也接手过那种没有请求类的项目呢,每个请求写了一堆代码,用的全部是ASI,,然后需要更改为AFN的时候,哇,简直无敌了,然后Command+F都用不上,只能一处处找,找的自己都不知道时间了,真的相当折磨,受过这个折磨的童鞋肯定能够体会这种痛苦,有种删除项目,拍屁股走人的邪恶想法,但是呢,毕竟咱的职业素养还在,所以就耐心的享受这折磨了.废话不多说,相信每个开发的童鞋都能知道一个好的网络请求类带给我们的便捷之处.
* 1.Swift3.0*
不用过多介绍什么,Swift是苹果主推的开发语言,老司机都知道原来是OC,Swift语言笔者前天花了一下午+一晚上的时间学习了下,确实很简洁,开发速度确实很快,风格类似于(JS+Python)我比较喜欢的是Swift中的泛型,泛型这个东西Java中有,当初写Java的时候泛型真的让我方便了很多很多,所以在进行iOS开发的时候一直琢磨着有没有泛型这个东西,可是呢,都知道没有…最近安卓新出的kotlin语言,跟Swift也是大同小异吧.
* 2.AFN*
AFN是一套iOS网络请求框架,用OC语言编写(我记得原来有Swift语言编写的,但是去GitHub上找的时候没有找到)这个框架现在几乎所有的iOS项目都在用吧,确实很好用,当然不缺乏大牛公司自己封装的,当然也可能有老项目还在用ASI(曾经火了好长时间,但是现在没人用了,WHy?因为作者不更新了…可悲不)
* 3.MJExtention*
MJExtention是李明杰大神的一套框架,主要用来字典转模型,这个框架的好用程度本人给100分,当然还有别的功能,其他的童鞋们慢慢去挖掘吧.即便你的对象里包含对象数组,它也可以帮你全部转换的哦,有不懂的或者有兴趣的可以直接去GitHub上下载学习一下,或者给我留言也可以哦.
4.封装思想
我也相信这些封装思想应该很多人都知道了,思想就像风暴一样,瞬间可以席卷全球,真是个神奇的东西,当然我的这个也是来源于网络上大神的分享.
AFN的源码我看了一遍,我们可以直接用AFHTTPSessionManager,有兴趣的童鞋可以研究下AFN的源码,然后我的想法是继承AFHTTPSessionManager创建一个RequsetManager类,(当然第一版我用的是装饰模式,是在RequsetManager中装饰一个AFHTTPSessionManager对象,当然两种方法各有各的优点,直接继承可能调用方法上更加简洁一点,然后也会减少一个对象的使用…)提供一个RequsetManager单例,然后创建一个NetworkService类,为所有的请求提供服务,在这个里面使用包装RequsetManager,使用RequsetManager下载数据,在NetworkService中提供对数据的解密,缓存(当然我没有去实现缓存的功能),以及对数据的解析转换(MJExtention在这儿真的起了很大的作用–在此转换数据的时候我们需要知道将json数据转换为什么样的对象,在OC版本中实现的时候我们是将要转换对象的Class当做参数传了过去,但是返回的结果是id的,我们用的时候需要进行强转,但是在Swift中我们有了泛型,所以这一步就简洁了很多,具体的祥看代码,后面会同样奉上OC版本的封装).
5.OC版本
RequsetManager:仅仅实现了Post和GET方法,声明了成功和失败的Block回调,一个重新载入请求头的,当然大部分是没有用的,另外一个是获取单利的,但是,所有的方法均是静态方法,获取单利是可以在外部单独设置请求头
#import "AFHTTPSessionManager.h"
typedef void (^requestSuccessBlock)(id responseObj);
typedef void (^requestFailureBlock) (NSError *error);
@interface RequsetManager : AFHTTPSessionManager
+ (instancetype)sharedRequestManager;
+ (void)AFN_ReloadHeaderAuth;
+ (void)AFN_GetRequest:(NSString *)url params:(NSDictionary *)params success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler;
+ (void)AFN_PostRequest:(NSString *)url params:(NSDictionary *)params success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler;
@end
实现如下:
#import "RequsetManager.h"
@interface RequsetManager()
@end
@implementation RequsetManager
+ (instancetype)sharedRequestManager{
static dispatch_once_t onceToken;
static RequsetManager * manager = nil;
dispatch_once(&onceToken, ^{
manager = [[self alloc]init];
manager.requestSerializer.timeoutInterval = 60.0f;
[manager.requestSerializer setValue:@"" forHTTPHeaderField:@"jwttoken"];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
});
return manager;
}
+ (void)AFN_ReloadHeaderAuth{
[[[self sharedRequestManager] requestSerializer] setValue:@"" forHTTPHeaderField:@"jwttoken"];
}
+ (void)AFN_GetRequest:(NSString *)url params:(NSDictionary *)params success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler{
[[self sharedRequestManager] GET:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
successHandler(responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
failureHandler(error);
}];
}
+ (void)AFN_PostRequest:(NSString *)url params:(