说到封装,首先咱们要说一下AFNetWorking的原理。
- AFNetworking 3.0 实现完全基于NSURLSessionTask进行封装,NSURLSessionTask 是苹果在iOS7 推出的网络请求api。
- 它支持支持https,网络数据请求,文件上传,文件下载,监听手机网络状态(2、3、4、wifi)。
- AFURLSessionManager是整个AFNetworking中最核心的一个类。如果想用NSURLSession函数族自己实现网络通讯,可以参考这个类的一些做法。
- 直接从NSObject继承而来,并没有直接继承NSURLSession。session成为一个属性,用组合代替继承,更容易理解。
- 多线程采用了NSOperationQueue,这是对GCD的一种对象化封装,使用起来更方便,而且能够很方便地实现顺序依赖,取消等功能。
使用
AFNetWorking的使用分为三步
- 创建会话(Session)
- 创建请求(request)
- 创建任务(task),对数据进行上传
闲话少数,咱们直接来封装它。
基于NSObject的类创建一个继承于NSObject类的命名为(个人命名)NetManager的类。
封装的的时候首先需要下载AFNetWorking 这是链接
基于NSObject的类创建一个继承于NSObject类的NetManager的类。
在 .h中。
// Copyright © 2017年 马帅. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "AFNetworking.h"
//DownLoadFinishedBlock 是响应成功的回调,返回的是id类型,外部再转换成类型模型就可以了。
typedef void(^DownLoadFinishedBlock)(id responseObj);
//DownLoadFialedBlock 是响应失败的回调,只有一个 NSError 对象,外部可接收处理。
typedef void (^DownLoadFialedBlock)(NSError*error);
//DownLoadFinishedBlock 是响应成功的回调,返回的是id类型,外部再转换成类型模型就可以了。
typedef void(^DownLoadFinishedBlock)(id responseObj);
//DownLoadFialedBlock 是响应失败的回调,只有一个 NSError 对象,外部可接收处理。
typedef void (^DownLoadFialedBlock)(NSError*error);
get请求
+(void)doGetWithUrlStr:(NSString*)urlString parameters:(NSDictionary*)dic contentType:(NSString*)type finished:(DownLoadFinishedBlock)finished failure:(DownLoadFialedBlock)fialed;
post请求
+(void)doPostWithUrlStr:(NSString*)urlString parameters:(NSDictionary*)dic contentType:(NSString*)type finished:(DownLoadFinishedBlock)finished failure:(DownLoadFialedBlock)fialed;
在 .m中
GET请求的处理:
+(void)doGetWithUrlStr:(NSString*)urlString parameters:(NSDictionary*)dic contentType:(NSString*)type finished:(DownLoadFinishedBlock)finished failure:(DownLoadFialedBlock)fialed{
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:type, nil];
[manager GET:urlString parameters:dic progress:^(NSProgress * _Nonnull downloadProgress) {
// 这里可以获取到目前的数据请求的进度
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 请求成功,解析数据
finished(responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// 请求失败
fialed(error);
}];
}
POST请求的处理:
+(void)doPostWithUrlStr:(NSString*)urlString parameters:(NSDictionary*)dic contentType:(NSString*)type finished:(DownLoadFinishedBlock)finished failure:(DownLoadFialedBlock)fialed
{
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:type, nil];
[manager POST:urlString parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
// 拼接data到请求体,这个block的参数是遵守AFMultipartFormData协议的。
} progress:^(NSProgress * _Nonnull uploadProgress) {
// 这里可以获取到目前的数据请求的进度
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 请求成功,解析数据
finished(responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// 请求失败
fialed(error);
}];
}