iOS菜鸟之AFN的二次封装
我用一个单例类将一些常用的网络请求进行了二次封装,主要包括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的二次封装相关推荐
- iOS安全之二次封装AFN并设置请求头/执行HTTPS加强安全
以前都是直接复制粘贴二次封装好的代码 , 现在都忘了怎么写 . 恰好当前项目要用到请求头 , 在网上学习了一下 , 统一敲了一遍 .自从到了现在公司 , 才发现要学的东西太多了 , 当然 , 有个好的 ...
- iOS 项目中 网络请求Alamofire 的二次封装
iOS 项目中 网络请求Alamofire 的二次封装 1.先创建 网络请求的工具类 NetWorkTool 继承自NSObject class NetWorkTool: NSObject {} 2. ...
- iOS视频广告(二) (二次封装, Demo)
iOS视频广告(二) GoogleAds-IMA-iOS-SDK (GoogleAds-IMA-iOS-SDK 二次封装) 开发 开发环境: Xcode 7 运行条件: iOS(9.0+) 管理平台: ...
- 对MBProgressHUD进行二次封装并精简使用
对MBProgressHUD进行二次封装并精简使用 https://github.com/jdg/MBProgressHUD 几个效果图: 以下源码是MBProgressHUD支持最新的iOS8的版本 ...
- WebView独立进程方案-基于腾讯X5的二次封装
文章目录 更新记录 2021-12-06 2021-10-20 前言概述 基本使用 架构流程 命令模式 预初始化 前端使用文档与代码 参考 更新记录 2021-12-06 WebView支持多进程多任 ...
- Glide二次封装库的使用
更多代码可以查询本人GitHub:欢迎阅读,star点起来. Glide二次封装库源码 前言 为什么选择Glide? Glide 轻量级 速度快 可以根据所需加载图片的大小自动适配所需分辨率的图 支 ...
- 高德地图markevents_GitHub - mingxuWang/Map: 高德地图API二次封装
Map组件设计文档 组件设计目的 分析当前各业务方向(销售端.商城.数据可视化.TMS)内地图相关应用的地图功能使用情况,封装Map组件供给各业务向进行使用. 将高德地图API进行二次封装,降低地图相 ...
- Android 应用程序集成Google 登录及二次封装
谷歌登录API: https://developers.google.com/identity/sign-in/android/ 1.注册并且登录google网站 https://accounts. ...
- vue全家桶 ---axios的使用和二次封装
1.前提基础 本文在vue项目搭建的基础上,vue-router路由配置的基础上,对vue项目中axios的使用进行介绍. 2.axios的使用以及拦截器的设置. 安装axios cnpm i axi ...
最新文章
- android平台自动化编译环境搭建一hudson安装
- pythondjango项目集成_[Python]将Wagtail整合到Django2项目中
- JavaSE学习53:细说多线程之内存可见性
- java异常个人理解
- 使用MSIL 汇编程序 (Ilasm.exe) 2 强签名
- c#与access建立连接用作登录_SQLServer成功与服务器建立连接,但在登录中发生错误
- 善于从错误中总结,而且还要持之以恒地达到目标
- 毕业设计《项目管理》总结06之ajax的初步使用经验
- Freeswitch一路呼叫的生命周期
- JAVA RSA加密解密代码范例(byte[]版)
- 在Eclipse的DDMS中查找genymotion模拟器的sdcard中的文件---开发中遇到的问题(一)...
- 最新影视双端直播盒子源码,自定义资源采集
- JavaScript离线帮助文档 网盘下载
- Http Simulate
- 计算机网络面试需要掌握的知识点汇总
- JavaScript 视频、图片转成Base64格式
- python初学问题:IndentationError: expected an indented block
- #9733;用辩证数学解答“缸中之脑”
- 百度网盘批量上传文件工具
- 设置Windows10系统下电脑屏幕自动关闭的时间(只关闭屏幕,电脑主机不关机)
热门文章
- ELK - 实用日志分析系统
- 揭开 Facebook Growth Hacking 的神秘面纱,微信、人人为何都在效仿?
- IIS6架设网站常见问题及症状答疑
- 我对windows核心编程的理解之一
- javac命令不好用的解决方法
- typescript设置默认值_TypeScript输入参数的默认值一例,以及对应生成的JavaScript代码分析...
- raspberry pi_您应该选择哪种Raspberry Pi?
- 编程 态度目标_对目标持开放态度,从而推动事业发展
- linux 一切都是文件_一切都是文件
- 值不值 | 三分钟搞定jpa?值不值!