我用一个单例类将一些常用的网络请求进行了二次封装,主要包括post请求 get请求  图片文件上传下载  视频的断点续传等功能。

首先大家先去github上下载AFN,将文件夹内的AFNetworking文件夹拖入工程中,然后创建一个图片文件参数类代码如下:

#import <Foundation/Foundation.h>@interface UploadParam : NSObject
/***  上传文件的二进制数据*/
@property (nonatomic, strong) NSData *data;
/***  上传的参数名称*/
@property (nonatomic, copy) NSString *name;
/***  上传到服务器的文件名称*/
@property (nonatomic, copy) NSString *fileName;/***  上传文件的类型*/
@property (nonatomic, copy) NSString *mimeType;@end

#import "UploadParam.h"@implementation UploadParam@end

然后创建网络工具AFNManager具体代码如下(此处我提供了代理和block两种方式进行传值供大家选择):

#import <Foundation/Foundation.h>
#import "AFNManagerDelegate.h"
#import "UploadParam.h"
@interface AFNManager : NSObject@property (nonatomic, weak) id<AFNManagerDelegate> delegate;/***  AFNManager单利*/
+(AFNManager *)sharedManager;
#pragma mark --代理的方式传值
/***  get*/
- (void)GET:(NSString *)URLString parameters:(id)parameters;/***  post*/
- (void)Post:(NSString *)URLString parameters:(id)parameters;/***  upload*/
- (void)Upload:(NSString *)URLString parameters:(id)parameters uploadParam:(UploadParam *)uploadParam;#pragma mark --block的形式传值
/***  get请求*/
- (void)GET:(NSString *)URLString parameters:(id)parameters succeed:(void (^)(id data))succeed failure:(void (^)(NSError *error))failure;
/***  post请求*/
- (void)Post:(NSString *)URLString parameters:(id)parameters succeed:(void (^)(id data))succeed failure:(void (^)(NSError *error))failure;
/***  upload*/
- (void)Upload:(NSString *)URLString parameters:(id)parameters uploadParam:(UploadParam *)uploadParam succeed:(void (^)(id data))succeed failure:(void (^)(NSError *error))failure;#pragma mark --断点续传
/***  开始下载  断点续传**  @param URLString 请求接口*/
- (void)downloadStartWithUrl:(NSString *)URLString fileName:(NSString *)fileName;
/***  开始上传  断点续传**  @param URLString 请求接口*/
- (void)uploadStartWithUrl:(NSString *)URLString fileData:(NSData *)fileData;
/***  暂停操作  断点续传*/
- (void)operationPause;
/***  继续操作  断点续传*/
- (void)operationResume;
/***  取消操作*/
- (void)operationCancel;
@end

#import "AFNManager.h"
#import "AFNetworking.h"
@interface AFNManager()
{AFHTTPRequestOperation *operation; //创建请求管理(用于上传和下载)
}
@end
static AFNManager *manager = nil;
@implementation AFNManager
+(AFNManager *)sharedManager
{static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{if (manager == nil) {manager = [[self alloc] init];}});return manager;
}+(instancetype)allocWithZone:(struct _NSZone *)zone
{static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{if (manager == nil) {manager = [super allocWithZone:zone];}});return manager;
}
- (void)GET:(NSString *)URLString parameters:(id)parameters
{// 创建请求管理者AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];[mgr GET:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) {[self.delegate AFNManagerDidSuccess:responseObject];}} failure:^(AFHTTPRequestOperation *operation, NSError *error) {if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) {[self.delegate AFNManagerDidFaild:error];}}];
}- (void)Post:(NSString *)URLString parameters:(id)parameters
{// 创建请求管理者AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];[mgr POST:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) {[self.delegate AFNManagerDidSuccess:responseObject];}} failure:^(AFHTTPRequestOperation *operation, NSError *error) {if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) {[self.delegate AFNManagerDidFaild:error];}}];
}- (void)Upload:(NSString *)URLString parameters:(id)parameters uploadParam:(UploadParam *)uploadParam
{// 创建请求管理者AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];[mgr POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { // 上传的文件全部拼接到formData/***  FileData:要上传的文件的二进制数据*  name:上传参数名称*  fileName:上传到服务器的文件名称*  mimeType:文件类型*/[formData appendPartWithFileData:uploadParam.data name:uploadParam.name fileName:uploadParam.fileName mimeType:uploadParam.mimeType];} success:^(AFHTTPRequestOperation *operation, id responseObject) {if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) {[self.delegate AFNManagerDidSuccess:responseObject];}} failure:^(AFHTTPRequestOperation *operation, NSError *error) {if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) {[self.delegate AFNManagerDidFaild:error];}}];}
-(void)GET:(NSString *)URLString parameters:(id)parameters succeed:(void (^)(id))succeed failure:(void (^)(NSError *))failure
{// 创建请求管理者AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];[mgr GET:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {if (responseObject == nil) {return ;}succeed(responseObject);} failure:^(AFHTTPRequestOperation *operation, NSError *error) {failure(error);}];
}
-(void)Post:(NSString *)URLString parameters:(id)parameters succeed:(void (^)(id))succeed failure:(void (^)(NSError *))failure
{// 创建请求管理者AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];[mgr POST:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {if (responseObject == nil) {return ;}succeed(responseObject);} failure:^(AFHTTPRequestOperation *operation, NSError *error) {failure(error);}];}
-(void)Upload:(NSString *)URLString parameters:(id)parameters uploadParam:(UploadParam *)uploadParam succeed:(void (^)(id))succeed failure:(void (^)(NSError *))failure
{// 创建请求管理者AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];[mgr POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { // 上传的文件全部拼接到formData/***  FileData:要上传的文件的二进制数据*  name:上传参数名称*  fileName:上传到服务器的文件名称*  mimeType:文件类型*/[formData appendPartWithFileData:uploadParam.data name:uploadParam.name fileName:uploadParam.fileName mimeType:uploadParam.mimeType];} success:^(AFHTTPRequestOperation *operation, id responseObject) {if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) {succeed(responseObject);}} failure:^(AFHTTPRequestOperation *operation, NSError *error) {if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) {failure(error);}}];}
-(void)downloadStartWithUrl:(NSString *)URLString fileName:(NSString *)fileName
{NSString *filePath = [NSString stringWithFormat:@"%@/Documents/%@",NSHomeDirectory(), fileName];operation = [[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:URLString]]];operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];
//    可以在此设置进度条//    [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
//
//    }];__weak typeof(self) weakself = self;[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {//        请求成功做出提示if (weakself.delegate && [weakself.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) {[weakself.delegate AFNManagerDidSuccess:responseObject];}} failure:^(AFHTTPRequestOperation *operation, NSError *error) {//        请求失败做出提示if (weakself.delegate && [weakself.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) {[weakself.delegate AFNManagerDidFaild:error];}}];[operation start];
}
- (void)uploadStartWithUrl:(NSString *)URLString fileData:(NSData *)fileData
{operation = [[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:URLString]]];operation.inputStream = [[NSInputStream alloc] initWithData:fileData];//    设置进度条
//    [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
//
//    }];__weak typeof(self) weakself = self;[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {//        请求成功做出提示if (weakself.delegate && [weakself.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) {[weakself.delegate AFNManagerDidSuccess:responseObject];}} failure:^(AFHTTPRequestOperation *operation, NSError *error) {//        请求失败做出提示if (weakself.delegate && [weakself.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) {[weakself.delegate AFNManagerDidFaild:error];}}];[operation start];
}
- (void)operationPause
{[operation pause];
}
- (void)operationResume
{[operation resume];
}
- (void)operationCancel
{[operation cancel];
}//网络监听(用于检测网络是否可以链接。此方法最好放于AppDelegate中,可以使程序打开便开始检测网络)
- (void)reachabilityManager
{AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];//打开网络监听
    [mgr.reachabilityManager startMonitoring];//监听网络变化[mgr.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {switch (status) {//当网络不可用(无网络或请求延时)case AFNetworkReachabilityStatusNotReachable:break;//当为手机WiFi时case AFNetworkReachabilityStatusReachableViaWiFi:break;//当为手机蜂窝数据网case AFNetworkReachabilityStatusReachableViaWWAN:break;//其它情况default:break;}}];//    //停止网络监听(若需要一直检测网络状态,可以不停止,使其一直运行)
//    [mgr.reachabilityManager stopMonitoring];
}@end

网络工具代理协议代码如下:

#import <Foundation/Foundation.h>
@class AFNManager;@protocol AFNManagerDelegate <NSObject>@optional
/***  发送请求成功**  @param manager AFNManager*/
-(void)AFNManagerDidSuccess:(id)data;
/***  发送请求失败**  @param manager AFNManager*/
-(void)AFNManagerDidFaild:(NSError *)error;
@end

有很多不足之处请大家多多指正,可以评论或点关注进行技术交流。后续也会写一些自己平时学习的点点滴滴。

转载于:https://www.cnblogs.com/sxwangjiadong/p/4970751.html

iOS菜鸟之AFN的二次封装相关推荐

  1. iOS安全之二次封装AFN并设置请求头/执行HTTPS加强安全

    以前都是直接复制粘贴二次封装好的代码 , 现在都忘了怎么写 . 恰好当前项目要用到请求头 , 在网上学习了一下 , 统一敲了一遍 .自从到了现在公司 , 才发现要学的东西太多了 , 当然 , 有个好的 ...

  2. iOS 项目中 网络请求Alamofire 的二次封装

    iOS 项目中 网络请求Alamofire 的二次封装 1.先创建 网络请求的工具类 NetWorkTool 继承自NSObject class NetWorkTool: NSObject {} 2. ...

  3. iOS视频广告(二) (二次封装, Demo)

    iOS视频广告(二) GoogleAds-IMA-iOS-SDK (GoogleAds-IMA-iOS-SDK 二次封装) 开发 开发环境: Xcode 7 运行条件: iOS(9.0+) 管理平台: ...

  4. 对MBProgressHUD进行二次封装并精简使用

    对MBProgressHUD进行二次封装并精简使用 https://github.com/jdg/MBProgressHUD 几个效果图: 以下源码是MBProgressHUD支持最新的iOS8的版本 ...

  5. WebView独立进程方案-基于腾讯X5的二次封装

    文章目录 更新记录 2021-12-06 2021-10-20 前言概述 基本使用 架构流程 命令模式 预初始化 前端使用文档与代码 参考 更新记录 2021-12-06 WebView支持多进程多任 ...

  6. Glide二次封装库的使用

    更多代码可以查询本人GitHub:欢迎阅读,star点起来.  Glide二次封装库源码 前言 为什么选择Glide? Glide 轻量级 速度快 可以根据所需加载图片的大小自动适配所需分辨率的图 支 ...

  7. 高德地图markevents_GitHub - mingxuWang/Map: 高德地图API二次封装

    Map组件设计文档 组件设计目的 分析当前各业务方向(销售端.商城.数据可视化.TMS)内地图相关应用的地图功能使用情况,封装Map组件供给各业务向进行使用. 将高德地图API进行二次封装,降低地图相 ...

  8. Android 应用程序集成Google 登录及二次封装

    谷歌登录API:  https://developers.google.com/identity/sign-in/android/ 1.注册并且登录google网站 https://accounts. ...

  9. vue全家桶 ---axios的使用和二次封装

    1.前提基础 本文在vue项目搭建的基础上,vue-router路由配置的基础上,对vue项目中axios的使用进行介绍. 2.axios的使用以及拦截器的设置. 安装axios cnpm i axi ...

最新文章

  1. android平台自动化编译环境搭建一hudson安装
  2. pythondjango项目集成_[Python]将Wagtail整合到Django2项目中
  3. JavaSE学习53:细说多线程之内存可见性
  4. java异常个人理解
  5. 使用MSIL 汇编程序 (Ilasm.exe) 2 强签名
  6. c#与access建立连接用作登录_SQLServer成功与服务器建立连接,但在登录中发生错误
  7. 善于从错误中总结,而且还要持之以恒地达到目标
  8. 毕业设计《项目管理》总结06之ajax的初步使用经验
  9. Freeswitch一路呼叫的生命周期
  10. JAVA RSA加密解密代码范例(byte[]版)
  11. 在Eclipse的DDMS中查找genymotion模拟器的sdcard中的文件---开发中遇到的问题(一)...
  12. 最新影视双端直播盒子源码,自定义资源采集
  13. JavaScript离线帮助文档 网盘下载
  14. Http Simulate
  15. 计算机网络面试需要掌握的知识点汇总
  16. JavaScript 视频、图片转成Base64格式
  17. python初学问题:IndentationError: expected an indented block
  18. #9733;用辩证数学解答“缸中之脑”
  19. 百度网盘批量上传文件工具
  20. 设置Windows10系统下电脑屏幕自动关闭的时间(只关闭屏幕,电脑主机不关机)

热门文章

  1. ELK - 实用日志分析系统
  2. 揭开 Facebook Growth Hacking 的神秘面纱,微信、人人为何都在效仿?
  3. IIS6架设网站常见问题及症状答疑
  4. 我对windows核心编程的理解之一
  5. javac命令不好用的解决方法
  6. typescript设置默认值_TypeScript输入参数的默认值一例,以及对应生成的JavaScript代码分析...
  7. raspberry pi_您应该选择哪种Raspberry Pi?
  8. 编程 态度目标_对目标持开放态度,从而推动事业发展
  9. linux 一切都是文件_一切都是文件
  10. 值不值 | 三分钟搞定jpa?值不值!