由于AFNetworking底层请求由NSURLConnection更新为NSURLSession,管理者对象也由AFHTTPRequestOperationManager更新为AFURLSessionManager。
本文重点讲述如何封装AFN业务类,将第三方为程序带来的污染减小到最低。
读者可以结合老版本AFHTTPRequestOperationManager的封装去理解,具体请参考:
iOS 【network-封装业务类AFNetworking(AFHTTPRequestOperationManager 废弃)】
代码描述:
① 封装业务类
//
// WZYAFNTool.h
// 0716-02AFN上传下载GETPOST-01
//
// Created by 王中尧 on 16/7/16.
// Copyright © 2016年 wzy. All rights reserved.
//
#import
@class AFNetWorking;
@interface WZYAFNTool : NSObject
+ (void)get:(NSString *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(NSError *error))failure;
+ (void)post:(NSString *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(NSError *error))failure;
+ (void)unload:(NSString *)uploadUrl parameters:(id)params filePath:(NSString *)filePath name:(NSString *)name progress:(void (^)(NSProgress *))progress success:(void (^)(id object))success failure:(void (^)(NSError *))failure;
+ (void)download:(NSString *)url progress:(void (^)(NSProgress *progress))progress destination:(NSURL *(^)(NSURL *targetPath, NSURLResponse *response))destination failure:(void (^)(NSURLResponse * response, NSURL * filePath, NSError * error))failure;
@end
//
// WZYAFNTool.m
// 0716-02AFN上传下载GETPOST-01
//
// Created by 王中尧 on 16/7/16.
// Copyright © 2016年 wzy. All rights reserved.
//
#import "WZYAFNTool.h"
#import "AFNetworking.h"
@implementation WZYAFNTool
+ (void)get:(NSString *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(NSError *error))failure {
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (success) {
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
failure(error);
}
}];
}
+ (void)post:(NSString *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(NSError *error))failure {
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (success) {
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
failure(error);
}
}];
}
+ (void)unload:(NSString *)uploadUrl parameters:(id)params filePath:(NSString *)filePath name:(NSString *)name progress:(void (^)(NSProgress *progress))progress success:(void (^)(id object))success failure:(void (^)(NSError *error))failure {
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager POST:uploadUrl parameters:params constructingBodyWithBlock:^(id _Nonnull formData) {
/*
第一个参数:要上传的文件的URL
第二个参数:后台接口规定
第三个参数:错误信息
*/
[formData appendPartWithFileURL:[NSURL fileURLWithPath:filePath] name:name error:nil];
} progress:^(NSProgress * _Nonnull uploadProgress) {
if (progress) {
progress(uploadProgress);
}
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (success) {
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
failure(error);
}
}];
}
+ (void)download:(NSString *)url progress:(void (^)(NSProgress *progress))progress destination:(NSURL *(^)(NSURL *targetPath, NSURLResponse *response))destination failure:(void (^)(NSURLResponse * response, NSURL * filePath, NSError * error))failure {
// 1 创建会话管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2 创建请求路径 请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
// 3 创建请求下载操作对象
NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
if (progress) {
progress(downloadProgress);
}
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
if (destination) {
return destination(targetPath, response);
} else {
return nil;
}
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
if (failure) {
failure(response, filePath, error);
}
}];
// 4 执行任务发送下载操作请求
[downTask resume];
}
@end
② 调用
//
// ViewController.m
// 0716-02AFN上传下载GETPOST-01
//
// Created by 王中尧 on 16/7/16.
// Copyright © 2016年 wzy. All rights reserved.
//
#import "ViewController.h"
#import "AFNetworking.h"
#import "WZYAFNTool.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
// 使用AFN原生方法
// [self getAFN];
// [self postAFN];
// [self upload];
// [self download];
// 使用WZYAFNTool业务类
// [self wzyGET];
// [self wzyPOST];
// [self wzyUpload];
// [self wzyDownload];
}
// AFN GET请求
- (void)getAFN {
// 1 封装会话管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2 拼接请求参数
NSDictionary *dict = @{
@"username" : @"xxx",
@"pwd" : @"xxx",
@"type" : @"JSON"
};
// 3 发送请求
/*
第一个参数:请求路径(!不包含参数) 类型是NSString
以前:http://120.25.226.186:32812/login?username=xxx&pwd=xxx&type=JSON
现在:http://120.25.226.186:32812/login
第二个参数:参数(用字典来保存参数)
第三个参数:progress 进度回调
第四个参数:success成功之后的回调
responseObject:注意此参数是响应体(内部已经完成了反序列化处理:JSON--->OC,此处类型为id,也就是OC对象)
task.response:响应头
第五个参数:failure 失败之后的回调
*/
[manager GET:@"http://120.25.226.186:32812/login" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success---%@---%@", responseObject, [responseObject class]);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"failure---%@", error);
}];
}
// WZYAFNTool GET请求
- (void)wzyGET {
NSDictionary *dict = @{
@"username" : @"xxx",
@"pwd" : @"xxx",
@"type" : @"JSON"
};
[WZYAFNTool get:@"http://120.25.226.186:32812/login" parameters:dict success:^(id object) {
NSLog(@"success---%@", object);
} failure:^(NSError *error) {
NSLog(@"error---%@", error);
}];
}
// AFN POST请求
- (void)postAFN {
// 1 封装会话管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2 拼接请求参数
NSDictionary *dict = @{
@"username" : @"xxx",
@"pwd" : @"xxx",
@"type" : @"JSON"
};
// 3 发送请求
/*
第一个参数:请求路径(!不包含参数) 类型是NSString
以前:http://120.25.226.186:32812/login?username=xxx&pwd=123&type=JSON
现在:http://120.25.226.186:32812/login
第二个参数:参数(用字典来保存参数)
第三个参数:progress 进度回调
第四个参数:success成功之后的回调
responseObject:注意此参数是响应体(内部已经完成了反序列化处理:JSON--->OC,此处类型为id,也就是OC对象)
task.response:响应头
第五个参数:failure 失败之后的回调
*/
[manager POST:@"http://120.25.226.186:32812/login" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success---%@---%@", responseObject, [responseObject class]);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"failure---%@", error);
}];
}
// WZYAFNTool POST请求
- (void)wzyPOST {
NSDictionary *dict = @{
@"username" : @"xxx",
@"pwd" : @"xxx",
@"type" : @"JSON"
};
[WZYAFNTool post:@"http://120.25.226.186:33122/login" parameters:dict success:^(id object) {
NSLog(@"success---%@", object);
} failure:^(NSError *error) {
NSLog(@"error---%@", error);
}];
}
// AFN 上传
- (void)upload {
// 1 创建请求者对象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2 发送POST请求上传数据文件
NSDictionary *dict = @{@"wzy" : @"wangzhongyao"};
/*
第一个参数: 请求路径
第二个参数: 非文件参数 (字典)
第三个参数: constructingBodyWithBlock 处理上传的文件
第四个参数: progress 进度回调
第五个参数: success 成功之后的回调
responseObject 响应体
第六个参数: failure 失败之后的回调
*/
[manager POST:@"http://120.25.226.186:31112/upload" parameters:dict constructingBodyWithBlock:^(id _Nonnull formData) {
/*
第一个参数:要上传的文件的URL
第二个参数:后台接口规定
第三个参数:错误信息
*/
[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/wangzhongyao/Desktop/Snip20160716_17.png"] name:@"file" error:nil];
} progress:^(NSProgress * _Nonnull uploadProgress) {
// 上传进度
NSLog(@"unload --- %f", 1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//JSON--->OC 反序列化
NSLog(@"响应体 --- %@",responseObject); // responseObject 响应体 在方法内部就反序列化成功
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// 输出错误信息
NSLog(@"%@", error);
}];
}
// WZYAFNTool 上传
- (void)wzyUpload {
NSDictionary *dict = @{@"wzy" : @"wangzhongyao"};
[WZYAFNTool unload:@"http://120.25.226.186:32812/upload" parameters:dict filePath:@"/Users/wangzhongyao/Desktop/Snip20160716_17.png" name:@"file" progress:^(NSProgress *progress) {
// 上传进度
NSLog(@"unload --- %f", 1.0 *progress.completedUnitCount / progress.totalUnitCount);
} success:^(id object) {
//JSON--->OC 反序列化
NSLog(@"响应体 --- %@",object); // responseObject 响应体 在方法内部就反序列化成功
} failure:^(NSError *error) {
// 输出错误信息
NSLog(@"%@", error);
}];
}
// AFN 下载
- (void)download {
/*
第一个参数: 请求对象
第二个参数: progress进度回调
第三个参数: destination URL处理的回调
targetPath:文件下载到沙盒中的临时路径
response:响应头信息
返回值: 告诉AFN文件应该剪切到什么地方
第四个参数: completionHandler完成之后的回调
filePath:就是文件的最终保存位置
*/
// 1 创建会话管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2 创建请求路径 请求对象
NSURL *url = [NSURL URLWithString:@"http://www.bz55.com/uploads/allimg/150326/140-150326141213-50.jpg"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 3 创建请求下载操作对象
NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
// 计算进度
NSLog(@"downloading --- %f", 1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
// 获得文件下载保存的全路径
NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
NSLog(@"fullPath --- %@, tmpPath --- %@", fullPath, targetPath); // 打印需要修改的全路径 & 临时路径
// 该方法会拼接上协议头 file:// 成为一个完整的URL,而URLWithString不会自动拼接协议头
return [NSURL fileURLWithPath:fullPath]; // 该block是有返回值的,返回文件剪切保存的路径
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
NSLog(@"filePath --- %@", filePath);
}];
// 4 执行任务发送下载操作请求
[downTask resume];
}
// WZYAFNTool 下载
- (void)wzyDownload {
[WZYAFNTool download:@"http://www.bz55.com/uploads/allimg/150326/140-150326141213-50.jpg" progress:^(NSProgress *progress) {
// 计算进度
NSLog(@"downloading --- %f", 1.0 * progress.completedUnitCount / progress.totalUnitCount);
} destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
// 获得文件下载保存的全路径
NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
NSLog(@"fullPath --- %@, tmpPath --- %@", fullPath, targetPath); // 打印需要修改的全路径 & 临时路径
// 该方法会拼接上协议头 file:// 成为一个完整的URL,而URLWithString不会自动拼接协议头
return [NSURL fileURLWithPath:fullPath];
} failure:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"filePath --- %@", filePath); // filePath --- (null)
}];
}
@end