我用一个单例类将一些常用的网络请求进行了二次封装,主要包括post请求 get请求 图片文件上传下载 视频的断点续传等功能。
首先大家先去github上下载AFN,将文件夹内的AFNetworking文件夹拖入工程中,然后创建一个图片文件参数类代码如下:
#import<Foundation/Foundation.h>@interfaceUploadParam : 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"@implementationUploadParam@end
然后创建网络工具AFNManager具体代码如下(此处我提供了代理和block两种方式进行传值供大家选择):
#import<Foundation/Foundation.h>#import"AFNManagerDelegate.h"#import"UploadParam.h"@interfaceAFNManager : NSObject
@property (nonatomic, weak)id<AFNManagerDelegate>delegate;/**
* AFNManager单利*/+(AFNManager *)sharedManager;#pragmamark --代理的方式传值/**
* 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;#pragmamark --block的形式传值/**
* get请求*/- (void)GET:(NSString *)URLString parameters:(id)parameters succeed:(void(^)(iddata))succeed failure:(void(^)(NSError *error))failure;/**
* post请求*/- (void)Post:(NSString *)URLString parameters:(id)parameters succeed:(void(^)(iddata))succeed failure:(void(^)(NSError *error))failure;/**
* upload*/- (void)Upload:(NSString *)URLString parameters:(id)parameters uploadParam:(UploadParam *)uploadParam succeed:(void(^)(iddata))succeed failure:(void(^)(NSError *error))failure;#pragmamark --断点续传/**
* 开始下载 断点续传
*
* @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"@interfaceAFNManager()
{
AFHTTPRequestOperation*operation;//创建请求管理(用于上传和下载)}@endstaticAFNManager *manager =nil;@implementationAFNManager+(AFNManager *)sharedManager
{staticdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{if(manager ==nil) {
manager=[[self alloc] init];
}
});returnmanager;
}+(instancetype)allocWithZone:(struct_NSZone *)zone
{staticdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{if(manager ==nil) {
manager=[super allocWithZone:zone];
}
});returnmanager;
}- (void)GET:(NSString *)URLString parameters:(id)parameters
{//创建请求管理者AFHTTPRequestOperationManager *mgr =[AFHTTPRequestOperationManager manager];
[mgr GET:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation,idresponSEObject) {if(self.delegate&& [self.delegaterespondsToSelector:@selector(AFNManagerDidSuccess:)]) {
[self.delegateAFNManagerDidSuccess:responseObject];
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {if(self.delegate&& [self.delegaterespondsToSelector:@selector(AFNManagerDidFaild:)]) {
[self.delegateAFNManagerDidFaild:error];
}
}];
}- (void)Post:(NSString *)URLString parameters:(id)parameters
{//创建请求管理者AFHTTPRequestOperationManager *mgr =[AFHTTPRequestOperationManager manager];
[mgr POST:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation,idresponseObject) {if(self.delegate&& [self.delegaterespondsToSelector:@selector(AFNManagerDidSuccess:)]) {
[self.delegateAFNManagerDidSuccess:responseObject];
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {if(self.delegate&& [self.delegaterespondsToSelector:@selector(AFNManagerDidFaild:)]) {
[self.delegateAFNManagerDidFaild: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,idresponseObject) {if(self.delegate&& [self.delegaterespondsToSelector:@selector(AFNManagerDidSuccess:)]) {
[self.delegateAFNManagerDidSuccess:responseObject];
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {if(self.delegate&& [self.delegaterespondsToSelector:@selector(AFNManagerDidFaild:)]) {
[self.delegateAFNManagerDidFaild: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,idresponseObject) {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,idresponseObject) {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,idresponseObject) {if(self.delegate&& [self.delegaterespondsToSelector:@selector(AFNManagerDidSuccess:)]) {
succeed(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {if(self.delegate&& [self.delegaterespondsToSelector:@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) {////}];__weaktypeof(self) weakself =self;
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation,idresponseObject) {//请求成功做出提示if(weakself.delegate&& [weakself.delegaterespondsToSelector:@selector(AFNManagerDidSuccess:)]) {
[weakself.delegateAFNManagerDidSuccess:responseObject];
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {//请求失败做出提示if(weakself.delegate&& [weakself.delegaterespondsToSelector:@selector(AFNManagerDidFaild:)]) {
[weakself.delegateAFNManagerDidFaild: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) {////}];__weaktypeof(self) weakself =self;
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation,idresponseObject) {//请求成功做出提示if(weakself.delegate&& [weakself.delegaterespondsToSelector:@selector(AFNManagerDidSuccess:)]) {
[weakself.delegateAFNManagerDidSuccess:responseObject];
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {//请求失败做出提示if(weakself.delegate&& [weakself.delegaterespondsToSelector:@selector(AFNManagerDidFaild:)]) {
[weakself.delegateAFNManagerDidFaild: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) {//当网络不可用(无网络或请求延时)caseAFNetworkReachabilityStatusNotReachable:
break;//当为手机WiFi时caseAFNetworkReachabilityStatusReachableViaWiFi:
break;//当为手机蜂窝数据网caseAFNetworkReachabilityStatusReachableViaWWAN:
break;//其它情况default:
break;
}
}];////停止网络监听(若需要一直检测网络状态,可以不停止,使其一直运行)//[mgr.reachabilityManager stopMonitoring];}@end
网络工具代理协议代码如下:
#import<Foundation/Foundation.h>@classAFNManager;@protocolAFNManagerDelegate <NSObject>@optional/**
* 发送请求成功
*
* @param manager AFNManager*/-(void)AFNManagerDidSuccess:(id)data;/**
* 发送请求失败
*
* @param manager AFNManager*/-(void)AFNManagerDidFaild:(NSError *)error;@end
有很多不足之处请大家多多指正,可以评论或点关注进行技术交流。后续也会写一些自己平时学习的点点滴滴。