✓AFN获取数据----by hanfeng
AFN是对 NSURLConnection,NSURLSession的封装
AFNetworking3.0删除了了对 NSURLConnection的封装内容
这是因为,NSURLSession能够完全替代NSURLConnection,并且具有很多优点
- 支持后台运行的网络任务
- 暂停、停止、重启网络任务,不需要自己封装NSOperation
- 支持断点续传,异步下载
- 支持上传,异步上传
- 获取下载、上传的进度
NSURLSession有3种任务
- NSURLSessionDataTask 用于小数据任务,例如网页
- NSURLSessionUploadTask 用于上传
- NSURLSessionDownloadTask 用于大文件的下载
AFNetworking3.0就是对上述3种任务的封装,默认支持json的序列化和反序列化,封装了Reachability判读网络是否连接,具有优秀的错误处理机制等优点。
直接使用AFN的时候,非常简单,只需要,创建一个实例对象或者单列,然后 GET 或者 POST即可。
✓AFN的封装----by hanfeng
通过对AFN的封装类,在项目中把AFN代码与网络请求的代码隔离开,这样做的好处是,一旦AFN出现重大bug或者我们更换另外的第三方网络请求框架时,会比较简单和方便。可以想象,如果我们自己的项目中到处充斥的都是直接使用AFN网络请求,那么修改和维护代码将是多么的麻烦。
封装AFN只需要一下3步:
1, 新建一个类,继承自AFN,如果我们只用到HTTP,可以直接继承AFHTTPSessionManager
2, 在类中提供一个类方法,用于创建这个类的对象,可以使用单例模式
3, 在类中提供一个对象方法,用于进行网络请求,提供参数,可以进行GET、POST、HEAD等请求。
具体示例demo
1 // 2 // ASNetworkingTools.h 3 // 测试03-AFN封装OC 4 // 5 // Created by hanfeng on 16/4/19. 6 // Copyright © 2016年 hanfeng. All rights reserved. 7 // 8 9 #import "AFHTTPSessionManager.h" 10 11 //枚举,列出请求的方式,还可以继续添加 12 typedef enum: NSInteger{ 13 GET, 14 POST, 15 HEADER 16 }ASRequestMethod; 17 18 19 @interface ASNetworkingTools : AFHTTPSessionManager 20 21 + (instancetype)sharedTools; 22 - (void)request:(ASRequestMethod)method urlString:(NSString *)urlString parameters:(id)parameters finished:(void(^)(id result, NSError *error))finished; 23 24 @end
// // ASNetworkingTools.m // 测试03-AFN封装OC // // Created by hanfeng on 16/4/19. // Copyright © 2016年 hanfeng. All rights reserved. // #import "ASNetworkingTools.h" @protocol ASNetworkingToolsProxy <NSObject> /* 这个方法实际是AFN中GET,POST调用的方法 -dataTaskWithHTTPMethod 但是,Xcode不提示,可以设计一个协议,提示这个方法,并使编译通过 这个方法,可以去AFN代码中直接复制过来 */ @optional - (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method URLString:(NSString *)URLString parameters:(id)parameters success:(void (^)(NSURLSessionDataTask *, id))success failure:(void (^)(NSURLSessionDataTask *, NSError *))failure; @end @interface ASNetworkingTools ()<ASNetworkingToolsProxy> @end @implementation ASNetworkingTools //网络工具的类方法,单例模式 +(instancetype)sharedTools{ static ASNetworkingTools *sharedTools; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSURL *baseUrl = [NSURL URLWithString:@"http://httpbin.org/"]; sharedTools = [[self alloc] initWithBaseURL:baseUrl]; }); return sharedTools; } //封装的对象方法,把AFN方法封装为 自己的 -request(参数1,参数2,参数3,参数4)方法使用在项目中 -(void)request:(ASRequestMethod)method urlString:(NSString *)urlString parameters:(id)parameters finished:(void (^)(id, NSError *))finished{ NSString *methodName = (method == GET) ? @"GET" : @"POST"; /* 这样把success和failure,成功和失败封装到一个finished方法中 */ [[self dataTaskWithHTTPMethod:methodName URLString:urlString parameters:parameters success:^(NSURLSessionDataTask *task, id result) { finished(result, nil); } failure:^(NSURLSessionDataTask *task, NSError *error) { finished(nil, error); }] resume]; if (method == GET) { [self GET:urlString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) { finished(responseObject, nil); } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) { finished(nil, error); }]; } else if (method == POST) { [self POST:urlString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) { finished(responseObject, nil); } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) { finished(nil, error); }]; } else if (method == HEADER) { //通过枚举判断还可调用,HEADER PUT DELETE方法 } } @end
✓JSON数据的解析----by hanfeng
json数据解析的方式有多种,
- 苹果原生的NSJSONSerialization
- JSONKit
- SBJson
- 通过AFN方式返回的json数据会自动进行解析
一般来说,用苹果原生的 NSJSONSerialization就可以满足json数据解析的需求
- NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
- JSON解析返回的对象是数组或字典,根据原始数据是由[] 或者 {}括起来的
- 如果JSON数据中有中文,输出的是经过Unicode编码的内容
- NSArray,NSDictionary重写-descriptionWithLocale()方法
- NSobject重写-description()方法