我用一个单例类将一些常用的网络请求进行了二次封装,主要包括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

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

iOS菜鸟之AFN的二次封装的更多相关文章

  1. iOS菜鸟之FMDB的二次封装简单易用

    闲来无事写点东西,希望大家多多指正! 大家先去git下载FMDB,然后将其中source文件夹中的fmdb文件夹拖入自己的项目中.最后就可以引用下面的代码对fmdb进行一次简单的封装. 这样可以更直观 ...

  2. swift4.0 对 afn 进行二次封装

    先将  afn 用pod导入到 工程中 创建一个类 ZHttpTools 继承自 AFHTTPSessionManager 一般我们不希望网络请求同时有多个存在,所以我们将这个工具类  设计成单例 代 ...

  3. 对AFN的二次封装

     .h .m

  4. AFN的二次封装

    http://www.cnblogs.com/sxwangjiadong/p/4970751.html

  5. iOS项目相关@AFN&SDWeb的二次封装

    一,AFNetworking跟SDWebImge是功能强大且常用的第三方,然而在实际应用中需要封装用来复用今天就跟大家分享一下AFN&SDWeb的二次封装 1. HttpClient.h及.m ...

  6. ios MBProgressHUD 使用,及二次封装

    MBProgressHUD是一个显示HUD窗口的第三方类库,用于在执行一些后台任务时,在程序中显示一个表示进度的loading视图和两个可选的文本提示的HUD窗口.MBProgressHUD 二次封装 ...

  7. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

  8. iOS开发之微信聊天工具栏的封装

    之前山寨了一个新浪微博(iOS开发之山寨版新浪微博小结),这几天就山寨个微信吧.之前已经把微信的视图结构简单的拖了一下(IOS开发之微信山寨版),今天就开始给微信加上具体的实现功能,那么就先从微信的聊 ...

  9. iOS开发UI篇—核心动画(UIView封装动画)

    iOS开发UI篇—核心动画(UIView封装动画) 一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画 ...

随机推荐

  1. lua metatable和metamethod元表和元方法

    Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加.假设a和b都是table,通过元表可以定义如何计算表达式a+b.当Lua试图将两个table相加时, ...

  2. codeforces #268 div2 D

    对于这道题第一感觉是图论相关然后我们先分析,假设a[i]在A集合需要的元素是a[x],在B集合是a[y]那么假设a[i]在A集合,那必然a[x]也必须在A集合,由于a[y]如果在B集合就没有对应元素, ...

  3. google font和@font-face

    会使用google字体 网址: http://www.google.com/fonts/ 选择字体, quick use 引用css: <link href='http://fonts.goog ...

  4. Robot Framework安装

    Robot Framework(中文站/社交化知识社区,源码)是一款Python编写的通用开源功能测试自动化框架,以作验收测试和验收测试驱动开发(ATDD),它是一种使用表格测试数据语法的关键字驱动的 ...

  5. 【转】265行JavaScript代码的第一人称3D H5游戏Demo

    译文:http://blog.jobbole.com/70956/ 原文:http://www.playfuljs.com/a-first-person-engine-in-265-lines/ 这是 ...

  6. Java 中UDP原理机制及实现方式介绍(建议阅读者阅读前了解下Java的基础知识,一方便理解)

    1.基本概念介绍: 首先得简单介绍下UDP. UDP( User Datagram Protocol )协议是用户数据报,在网络中它与TCP协议一样用于处理数据包.在OSI模型中,在第四层——传输层, ...

  7. udev:renamed network interface eth0 to eth1

    删除/etc/udev/rules.d/70-persistent-net.rules这个文件,重启

  8. 《University Calculus》-chape6-定积分的应用-平面曲线长度

    平面曲线的长度: 积分的重要作用体现在处理曲线和曲面. 在这里我们讨论平面中一条用参数形式表达的曲线:x=f(t),y=g(t),a≤t≤b. 如图. y=f(x)形式的弧长计算: 之前我们讨论过平面 ...

  9. 【转】SVN linux命令及 windows相关操作(二)

    转自这里:http://www.uml.org.cn/pzgl/200904246.asp 1 安装及下载client 端 2 什么是SVN(Subversion)? 3 为甚么要用SVN? 4 怎么 ...

  10. dijkstra算法(迪杰斯特拉算法)

    dijkstra算法(迪杰斯特拉算法) 用途:有向图最短路径问题 定义:迪杰斯特拉算法是典型的算法,一般的表述通常有两种方式,这里均采用永久和临时标号的方式,该算法要求图中不存在负权边 用永久和临时标 ...