由于AFNetworking底层请求由NSURLConnection更新为NSURLSession,管理者对象也由AFHTTPRequestOperationManager更新为AFURLSessionManager。

本文重点讲述如何封装AFN业务类,将第三方为程序带来的污染减小到最低。

 

代码描述:

① 封装业务类

//        


         //  WZYAFNTool.h        


         //  0716-02AFN上传下载GETPOST-01        


         //        


         //  Created by 王中尧 on 16/7/16.        


         //  Copyright © 2016年 wzy. All rights reserved.        


         //        


                  


         #         import          <foundation foundation.h=         ""         >        


         @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        


         </foundation>


//        


         //  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        


         </afmultipartformdata>



 

② 调用

//        


         //  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<uitouch> *)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"          : @         "520it"         ,        


                  @         "pwd"          : @         "520it"         ,        


                  @         "type"          : @         "JSON"        


                  };        


                  // 3 发送请求        


                  /*        


                  第一个参数:请求路径(!不包含参数) 类型是NSString        


                  以前:http://120.25.226.186:32812/login?username=520it&pwd=123&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"          : @         "520it"         ,        


                  @         "pwd"          : @         "520it"         ,        


                  @         "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"          : @         "520it"         ,        


                  @         "pwd"          : @         "520it"         ,        


                  @         "type"          : @         "JSON"        


                  };        


                  // 3 发送请求        


                  /*        


                  第一个参数:请求路径(!不包含参数) 类型是NSString        


                  以前:http://120.25.226.186:32812/login?username=520it&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"          : @         "520it"         ,        


                  @         "pwd"          : @         "520it"         ,        


                  @         "type"          : @         "JSON"        


                  };        


                  [WZYAFNTool post:@         "http://120.25.226.186:32812/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:32812/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.bz.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://        


                  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.bz.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://        


                  return          [NSURL fileURLWithPath:fullPath];        


                  


                  } failure:^(NSURLResponse *response, NSURL *filePath, NSError *error) {        


                  


                  NSLog(@         "filePath --- %@"         , filePath);          // filePath --- (null)        


                  


                  }];        


         }        


                  


         @end         </afmultipartformdata></uitouch>