博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS之AFNetWorking基本用法(一)上传、下载
阅读量:4288 次
发布时间:2019-05-27

本文共 31802 字,大约阅读时间需要 106 分钟。

#import 
NS_ASSUME_NONNULL_BEGINtypedef void(^ProgressBlock) (NSProgress* progress);typedef void(^SuccessBlock) (NSURLSessionDataTask *task, id responseObject);typedef void(^FailureBlock) (NSURLSessionDataTask *task, NSError *error);@interface LYHttpRequestManager : NSObject+(instancetype)sharedManager;//1.uploadTask上传数据-(void)uploadWithUploadTaskWithUrl:(NSString *)url params:(NSDictionary *)params successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock;//2.POST上传图片- (void)uploadUrl:(NSString *)url parameter:(NSDictionary *)param withImages:(NSArray *)images successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock;//3.下载数据带进度,可以暂停继续-(void)downloadWithProgressUrl:(NSString *)url params:(NSDictionary *)params successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock;//4.get请求数据-(void)normaldownloadWithUrl:(NSString *)url params:(NSDictionary *)params successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock;//5.post 请求数据-(void)lyRequestWithUrl:(NSString *)url params:(NSDictionary *)params successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock;@endNS_ASSUME_NONNULL_END****************#import "LYHttpRequestManager.h"#import "AFNetworking.h"@interface LYHttpRequestManager()@property(nonatomic,strong) NSURLSessionDownloadTask *downloadTask;@property(nonatomic,strong)AFURLSessionManager *manager;@property(nonatomic,strong)NSData *resumeData;@end@implementation LYHttpRequestManager+(instancetype)sharedManager{ static LYHttpRequestManager *httpRequestManager; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ httpRequestManager=[[LYHttpRequestManager alloc]init]; }); return httpRequestManager;}//http常用设置-(AFHTTPSessionManager *)httpNormalConfig{ //待超时时间 NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; config.timeoutIntervalForRequest =20.0; AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:config]; manager.requestSerializer=[AFHTTPRequestSerializer serializer]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];//安全策略 AFSSLPinningModeCertificate(校验证书) manager.securityPolicy.allowInvalidCertificates = YES;//客户端是否信任非法证书 manager.securityPolicy.validatesDomainName = NO;//不验证证书的域名 manager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/xml", @"text/plain; charset=utf-8", nil];//后台接受到请求后响应的数据类型 [manager.requestSerializer setValue:@"text/html;charset=utf-8" forHTTPHeaderField:@"Content-Type"]; //请求的URL所用的编码类型;如果不设置,默认的是json,客户端发送的数据类型 [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];//客户端或浏览器可以接受的数据类型 /* //下列请求头参数根据你自己的后台接口要求来设置 [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"]; [manager.requestSerializer setValue:@"application/json;charset=UTF-8" forHTTPHeaderField:@"Content-Type"]; [manager.requestSerializer setValue:@"keep-alive" forHTTPHeaderField:@"Connection"]; [manager.requestSerializer setValue:@"zh-cn" forHTTPHeaderField:@"language"]; //如果报接受类型不一致请替换一致text/html或别的 manager.responseSerializer.acceptableContentTypes = nil; 设置向请求内容的类型 [manager.requestSerializer setValue:@"application/json;charset=utf-8"forHTTPHeaderField:@"Content-Type"];//这个和 设置请求内容的长度 [manager.requestSerializer setValue:[NSStringstringWithFormat:@"%ld", (unsignedlong)[jsonStr length]] forHTTPHeaderField:@"Content-Length"]; 设置请求的编码类型 [manager.requestSerializer setValue:@"gzip"forHTTPHeaderField:@"Content-Encoding"]; */ return manager;}//1.uploadTask上传数据-(void)uploadWithUploadTaskWithUrl:(NSString *)urlparams:(NSDictionary *)paramssuccessBlock:(SuccessBlock)successBlockfailureBlock:(FailureBlock)failureBlock{ AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; NSURL *URL =[NSURL URLWithString:url]; NSURLRequest *requst = [NSURLRequest requestWithURL:URL]; UIImage *image=[UIImage imageNamed:@"test01"];//数据类型一: NSData* imageData =UIImagePNGRepresentation(image); //数据类型2// NSString *fileName=[[NSBundle mainBundle]pathForResource:@"test01.png"ofType:nil];// NSURL *fileUrl=[NSURL URLWithString:fileName];//******fromData可以是imageData,也可以是fileUrl; [manager uploadTaskWithRequest:requst fromData:imageData progress:^(NSProgress *_Nonnull uploadProgress) { //进度 } completionHandler:^(NSURLResponse *_Nonnull response,id _Nullable responseObject,NSError *_Nullable error) { }];}//2.POSt上传图片- (void)uploadUrl:(NSString *)url parameter:(NSDictionary *)param withImages:(NSArray *)images successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock { AFHTTPSessionManager *manager=[self httpNormalConfig]; // 在parameters里存放照片以外的对象 [manager POST:url parameters:param constructingBodyWithBlock:^(id
_Nonnull formData) { // formData: 专门用于拼接需要上传的数据,在此位置生成一个要上传的数据体 //上传方法一: for (int i =0; i < images.count; i++) { if ([images[i] isKindOfClass:[UIImage class]]) { UIImage *image = images[i]; NSData *imageData = UIImageJPEGRepresentation(image,1); // 上传文件,文件不允许被覆盖,文件重名 NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; // 设置时间格式 [formatter setDateFormat:@"yyyyMMddHHmmss"]; NSString *dateString = [formatter stringFromDate:[NSDate date]]; NSString *fileName = [NSString stringWithFormat:@"%@.jpg", dateString]; /* *该方法的参数 1. appendPartWithFileData:要上传的照片[二进制流] 2. name:对应网站上[upload.php中]处理文件的字段(比如upload) 3. fileName:要保存在服务器上的文件名 4. mimeType:上传的文件的类型 */ [formData appendPartWithFileData:imageData name:@"images" fileName:fileName mimeType:@"image/jpeg"]; }else { NSData *soundData = [NSData dataWithContentsOfFile:images[i]]; [formData appendPartWithFileData:soundData name:@"audios"fileName:@"audio.caf"mimeType:@"audio/mp3"]; } } //上传方法二:// [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"文件地址"] name:@"file" fileName:@"1234.png" mimeType:@"application/octet-stream" error:nil];//**************其他方法 // formData appendPartWithFileURL:<#(nonnull NSURL *)#> name:<#(nonnull NSString *)#> fileName:<#(nonnull NSString *)#> mimeType:<#(nonnull NSString *)#> error:<#(NSError *__autoreleasing _Nullable * _Nullable)#> //**************** // formData appendPartWithFormData:<#(nonnull NSData *)#> name:<#(nonnull NSString *)#> //************** // formData appendPartWithFileURL:<#(nonnull NSURL *)#> name:<#(nonnull NSString *)#> error:<#(NSError *__autoreleasing _Nullable * _Nullable)#> //**************** //***************** // formData appendPartWithInputStream:<#(nullable NSInputStream *)#> name:<#(nonnull NSString *)#> fileName:<#(nonnull NSString *)#> length:<#(int64_t)#> mimeType:<#(nonnull NSString *)#>//****************** } progress:^(NSProgress *_Nonnull uploadProgress) { } success:^(NSURLSessionDataTask *_Nonnull task,id _Nullable responseObject) { NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];//网页二进制数据转换成字符串 NSLog(@"str---%@",str); NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; NSLog(@"dict----%@",dict); if(dict){ if(successBlock){ successBlock(task,dict); } } } failure:^(NSURLSessionDataTask * _Nullable task,NSError *_Nonnull error) { failureBlock(task,error); }];}//3.===下载数据带进度 downloadtask,可以暂停继续-(void)downloadWithProgressUrl:(NSString *)url params:(NSDictionary *)params successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock{ //远程地址 NSURL *URL = [NSURL URLWithString:url]; //默认配置 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; //AFN3.0+基于封住URLSession的句柄 AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; self.manager=manager; //请求 NSURLRequest *request = [NSURLRequest requestWithURL:URL]; //下载Task操作 NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) { // @property int64_t totalUnitCount; 需要下载文件的总大小 // @property int64_t completedUnitCount; 当前已经下载的大小 // 给Progress添加监听 KVO NSLog(@"%f",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount); // 回到主队列刷新UI dispatch_async(dispatch_get_main_queue(), ^{ // 设置进度条的百分比 }); } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) { //- block的返回值, 要求返回一个URL, 返回的这个URL就是文件的位置的路径 NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename]; //使用建议的路径suggestedFilename return [NSURL fileURLWithPath:path];//转化为文件路径---下载到了这个地方 } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { //如果下载的是压缩包的话,可以在这里进行解压 NSLog(@"----%@---%ld---%@",error.domain,error.code,error); //下载成功 if (error ==nil) { // completion(YES,@"下载完成",[filePath path]); }else{//下载失败的时候,只列举判断了两种错误状态码 NSString * message =nil; if (error.code == - 1005) { message = @"网络异常"; }else if (error.code == -1001){ message = @"请求超时"; }else{ message = @"未知错误"; } // completion(NO,message,nil); } //设置下载完成操作 // filePath就是你下载文件的位置,你可以解压,也可以直接拿来使用 NSString *imgFilePath = [filePath path];// 将NSURL转成NSString UIImage *img = [UIImage imageWithContentsOfFile:imgFilePath]; }]; self.downloadTask=downloadTask;}//取消下载- (void)pauseClicked { [self.downloadTask cancelByProducingResumeData:^(NSData *_Nullable resumeData) { self.resumeData = resumeData;//记录当前下载的数据 self.downloadTask =nil;//吧任务置为空 }];}//继续下载- (void)continueClicked{ [self downloadTaskWithResumeData]; self.resumeData =nil;//吧保存的数据置为空}//继续下载-(void)downloadTaskWithResumeData{ [self.manager downloadTaskWithResumeData:self.resumeData progress:^(NSProgress *_Nonnull downloadProgress) { } destination:^NSURL *_Nonnull(NSURL *_Nonnull targetPath, NSURLResponse * _Nonnull response) { //这里要返回一个NSURL,其实就是文件的位置路径 NSString * path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)lastObject]; //使用建议的路径suggestedFilename path = [path stringByAppendingPathComponent:response.suggestedFilename]; NSLog(@"%@",path); return [NSURL fileURLWithPath:path];//转化为文件路径---下载到了这个地方 } completionHandler:^(NSURLResponse *_Nonnull response,NSURL * _Nullable filePath,NSError *_Nullable error) { }];}//4.get请求数据-(void)normaldownloadWithUrl:(NSString *)url params:(NSDictionary *)params successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock{ AFHTTPSessionManager *manager=[self httpNormalConfig]; [manager GET:url parameters:params progress:^(NSProgress * _Nonnull downloadProgress) { NSLog(@"下载进度:%@",downloadProgress); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"responseObject:%@",responseObject); NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];//网页二进制数据转换成字符串 NSLog(@"str---%@",str); NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; NSLog(@"dict----%@",dict); if(dict){ if(successBlock){ successBlock(task,dict); } } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { failureBlock(task,error); NSLog(@"error:%@",error); }];}//5.post 请求数据-(void)lyRequestWithUrl:(NSString *)url params:(NSDictionary *)params successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock{ AFHTTPSessionManager *manager=[self httpNormalConfig]; [manager POST:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];//网页二进制数据转换成字符串 NSLog(@"str---%@",str); NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; NSLog(@"dict----%@",dict); if(dict){ if(successBlock){ successBlock(task,dict); } } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { failureBlock(task,error); }];}@end

******取消网络请求

- (void)cancelRequest{    if ([manager.tasks count] > 0) {        NSLog(@"返回时取消网络请求");        [manager.tasks makeObjectsPerformSelector:@selector(cancel)];        //NSLog(@"tasks = %@",manager.tasks);//manager里面的tasks装的就是正在执行的网络请求。执行cancel后,tasks就会清空,网络请求会进入失败的状态,然后响应failure block,得到一个error的信息,表示请求已经成功取消了。    }}

 

*****************AFN没存泄露解决方法,方法一:mananger单利;方法二:请求结束销毁manager;

#import "AFHTTPSessionManager.h"NS_ASSUME_NONNULL_BEGIN@interface QMWNHttpM : AFHTTPSessionManager+(AFHTTPSessionManager *)sharehttpsessionmanager;@endNS_ASSUME_NONNULL_END#import "QMWNHttpM.h"@implementation QMWNHttpM+(AFHTTPSessionManager *)sharehttpsessionmanager{    static QMWNHttpM *httpsessionmanager=nil;    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        httpsessionmanager=[[QMWNHttpM alloc]init];        httpsessionmanager.requestSerializer.timeoutInterval=20.0;        httpsessionmanager.requestSerializer=[AFHTTPRequestSerializer serializer];        httpsessionmanager.responseSerializer = [AFHTTPResponseSerializer serializer];        //    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];//安全策略   AFSSLPinningModeCertificate(校验证书)        httpsessionmanager.securityPolicy.allowInvalidCertificates = YES;//客户端是否信任非法证书        httpsessionmanager.securityPolicy.validatesDomainName = NO;//不验证证书的域名                httpsessionmanager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/xml",@"text/css", @"text/plain;charset=utf-8", nil];        [httpsessionmanager.requestSerializer setValue:@"application/json;charset=utf-8"                         forHTTPHeaderField:@"Content-Type"];        [httpsessionmanager.requestSerializer         setValue:@"application/json" forHTTPHeaderField:@"Accept"];    });    return httpsessionmanager;}@end#import 
NS_ASSUME_NONNULL_BEGINtypedef void(^ProgressBlock) (NSProgress* progress);typedef void(^SuccessBlock) (NSURLSessionDataTask *task, id responseObject);typedef void(^FailureBlock) (NSURLSessionDataTask *task, NSError *error);@interface QMWNHttpRequestManager : NSObject+(instancetype)sharedManager;//1.uploadTask上传数据-(void)uploadWithUploadTaskWithUrl:(NSString *)url params:(NSDictionary *)params successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock;//2.POST上传图片- (void)uploadUrl:(NSString *)url parameter:(NSDictionary *)param withImages:(NSArray *)images successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock;//3.下载数据带进度,可以暂停继续-(void)downloadWithProgressUrl:(NSString *)url params:(NSDictionary *)params successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock;//4.get请求数据-(void)normaldownloadWithUrl:(NSString *)url params:(NSDictionary *)params successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock;//5.post 请求数据-(void)lyRequestWithUrl:(NSString *)url params:(NSDictionary *)params successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock;//6.普通的原生请求-(void)nativeRequestWithUrl:(NSString *)url params:(NSDictionary *)params successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock;@endNS_ASSUME_NONNULL_END#import "QMWNHttpRequestManager.h"#import "AFNetworking.h"@interface QMWNHttpRequestManager()@property(nonatomic,strong) NSURLSessionDownloadTask *downloadTask;@property(nonatomic,strong)AFURLSessionManager *manager;@property(nonatomic,strong)NSData *resumeData;@end@implementation QMWNHttpRequestManager+(instancetype)sharedManager{ static QMWNHttpRequestManager *httpRequestManager; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ httpRequestManager=[[QMWNHttpRequestManager alloc]init]; }); return httpRequestManager;}//http常用设置----使用单利这个方法就不用了-(AFHTTPSessionManager *)httpNormalConfig{ //待超时时间 NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; config.timeoutIntervalForRequest =20.0; AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:config]; manager.requestSerializer=[AFHTTPRequestSerializer serializer]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];//安全策略 AFSSLPinningModeCertificate(校验证书) manager.securityPolicy.allowInvalidCertificates = YES;//客户端是否信任非法证书 manager.securityPolicy.validatesDomainName = NO;//不验证证书的域名 manager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/xml",@"text/css", @"text/plain;charset=utf-8", nil]; [manager.requestSerializer setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"]; return manager;}//1.uploadTask上传数据-(void)uploadWithUploadTaskWithUrl:(NSString *)url params:(NSDictionary *)params successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock{ AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; NSURL *URL =[NSURL URLWithString:url]; NSURLRequest *requst = [NSURLRequest requestWithURL:URL]; UIImage *image=[UIImage imageNamed:@"test01"]; //数据类型一: NSData* imageData =UIImagePNGRepresentation(image); //数据类型2 // NSString *fileName=[[NSBundle mainBundle]pathForResource:@"test01.png"ofType:nil]; // NSURL *fileUrl=[NSURL URLWithString:fileName]; //******fromData可以是imageData,也可以是fileUrl; [manager uploadTaskWithRequest:requst fromData:imageData progress:^(NSProgress *_Nonnull uploadProgress) { //进度 } completionHandler:^(NSURLResponse *_Nonnull response,id _Nullable responseObject,NSError *_Nullable error) { }]; }//2.POSt上传图片- (void)uploadUrl:(NSString *)url parameter:(NSDictionary *)param withImages:(NSArray *)images successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock { AFHTTPSessionManager *manager=[self httpNormalConfig]; // 在parameters里存放照片以外的对象 [manager POST:url parameters:param constructingBodyWithBlock:^(id
_Nonnull formData) { // formData: 专门用于拼接需要上传的数据,在此位置生成一个要上传的数据体 //上传方法一: for (int i =0; i < images.count; i++) { if ([images[i] isKindOfClass:[UIImage class]]) { UIImage *image = images[i]; NSData *imageData = UIImageJPEGRepresentation(image,1); // 上传文件,文件不允许被覆盖,文件重名 NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; // 设置时间格式 [formatter setDateFormat:@"yyyyMMddHHmmss"]; NSString *dateString = [formatter stringFromDate:[NSDate date]]; NSString *fileName = [NSString stringWithFormat:@"%@.jpg", dateString]; /* *该方法的参数 1. appendPartWithFileData:要上传的照片[二进制流] 2. name:对应网站上[upload.php中]处理文件的字段(比如upload) 3. fileName:要保存在服务器上的文件名 4. mimeType:上传的文件的类型 */ [formData appendPartWithFileData:imageData name:@"images" fileName:fileName mimeType:@"image/jpeg"]; }else { NSData *soundData = [NSData dataWithContentsOfFile:images[i]]; [formData appendPartWithFileData:soundData name:@"audios"fileName:@"audio.caf"mimeType:@"audio/mp3"]; } } //上传方法二: // [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"文件地址"] name:@"file" fileName:@"1234.png" mimeType:@"application/octet-stream" error:nil]; //**************其他方法 // formData appendPartWithFileURL:<#(nonnull NSURL *)#> name:<#(nonnull NSString *)#> fileName:<#(nonnull NSString *)#> mimeType:<#(nonnull NSString *)#> error:<#(NSError *__autoreleasing _Nullable * _Nullable)#> //**************** // formData appendPartWithFormData:<#(nonnull NSData *)#> name:<#(nonnull NSString *)#> //************** // formData appendPartWithFileURL:<#(nonnull NSURL *)#> name:<#(nonnull NSString *)#> error:<#(NSError *__autoreleasing _Nullable * _Nullable)#> //**************** //***************** // formData appendPartWithInputStream:<#(nullable NSInputStream *)#> name:<#(nonnull NSString *)#> fileName:<#(nonnull NSString *)#> length:<#(int64_t)#> mimeType:<#(nonnull NSString *)#> //****************** } progress:^(NSProgress *_Nonnull uploadProgress) { } success:^(NSURLSessionDataTask *_Nonnull task,id _Nullable responseObject) { NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];//网页二进制数据转换成字符串 NSLog(@"str---%@",str); NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; NSLog(@"dict----%@",dict); if(dict){ if(successBlock){ successBlock(task,dict); } } } failure:^(NSURLSessionDataTask * _Nullable task,NSError *_Nonnull error) { failureBlock(task,error); }];}//3.===下载数据带进度 downloadtask,可以暂停继续-(void)downloadWithProgressUrl:(NSString *)url params:(NSDictionary *)params successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock{ //远程地址 NSURL *URL = [NSURL URLWithString:url]; //默认配置 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; //AFN3.0+基于封住URLSession的句柄 AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; self.manager=manager; //请求 NSURLRequest *request = [NSURLRequest requestWithURL:URL]; //下载Task操作 NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) { // @property int64_t totalUnitCount; 需要下载文件的总大小 // @property int64_t completedUnitCount; 当前已经下载的大小 // 给Progress添加监听 KVO NSLog(@"%f",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount); // 回到主队列刷新UI dispatch_async(dispatch_get_main_queue(), ^{ // 设置进度条的百分比 }); } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) { //- block的返回值, 要求返回一个URL, 返回的这个URL就是文件的位置的路径 NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename]; //使用建议的路径suggestedFilename return [NSURL fileURLWithPath:path];//转化为文件路径---下载到了这个地方 } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { //如果下载的是压缩包的话,可以在这里进行解压 NSLog(@"----%@---%ld---%@",error.domain,error.code,error); //下载成功 if (error ==nil) { // completion(YES,@"下载完成",[filePath path]); }else{//下载失败的时候,只列举判断了两种错误状态码 NSString * message =nil; if (error.code == - 1005) { message = @"网络异常"; }else if (error.code == -1001){ message = @"请求超时"; }else{ message = @"未知错误"; } // completion(NO,message,nil); } //设置下载完成操作 // filePath就是你下载文件的位置,你可以解压,也可以直接拿来使用 NSString *imgFilePath = [filePath path];// 将NSURL转成NSString UIImage *img = [UIImage imageWithContentsOfFile:imgFilePath]; }]; self.downloadTask=downloadTask;}//取消下载- (void)pauseClicked { [self.downloadTask cancelByProducingResumeData:^(NSData *_Nullable resumeData) { self.resumeData = resumeData;//记录当前下载的数据 self.downloadTask =nil;//吧任务置为空 }]; }//继续下载- (void)continueClicked{ [self downloadTaskWithResumeData]; self.resumeData =nil;//吧保存的数据置为空}//继续下载-(void)downloadTaskWithResumeData{ [self.manager downloadTaskWithResumeData:self.resumeData progress:^(NSProgress *_Nonnull downloadProgress) { } destination:^NSURL *_Nonnull(NSURL *_Nonnull targetPath, NSURLResponse * _Nonnull response) { //这里要返回一个NSURL,其实就是文件的位置路径 NSString * path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)lastObject]; //使用建议的路径suggestedFilename path = [path stringByAppendingPathComponent:response.suggestedFilename]; NSLog(@"%@",path); return [NSURL fileURLWithPath:path];//转化为文件路径---下载到了这个地方 } completionHandler:^(NSURLResponse *_Nonnull response,NSURL * _Nullable filePath,NSError *_Nullable error) { }]; }//4.get请求数据-(void)normaldownloadWithUrl:(NSString *)url params:(NSDictionary *)params successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock{ AFHTTPSessionManager *manager = [QMWNHttpM sharehttpsessionmanager];// __weak typeof(manager) weak_manager = manager; [manager GET:url parameters:params progress:^(NSProgress * _Nonnull downloadProgress) { NSLog(@"下载进度:%@",downloadProgress); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];//网页二进制数据转换成字符串 NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; if(dict){ if(successBlock){ successBlock(task,dict); } }// [weak_manager invalidateSessionCancelingTasks:YES]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { failureBlock(task,error);// [weak_manager invalidateSessionCancelingTasks:YES]; }];}//5.post 请求数据-(void)lyRequestWithUrl:(NSString *)url params:(NSDictionary *)params successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock{ AFHTTPSessionManager *manager = [QMWNHttpM sharehttpsessionmanager];// AFHTTPSessionManager *manager = [self httpNormalConfig];// __weak typeof(manager) weak_manager = manager;// NSLog(@"---manger--%@",manager); NSLog(@"参数---%@",params); [manager POST:url parameters:params constructingBodyWithBlock:^(id
_Nonnull formData) { } progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];//网页二进制数据转换成字符串 NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; NSLog(@"数据--%@",str); if(dict){ if(successBlock){ successBlock(task,dict); } }// [weak_manager invalidateSessionCancelingTasks:YES]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { failureBlock(task,error);// [weak_manager invalidateSessionCancelingTasks:YES]; }];}//6.普通的原生请求,AFN参数会有问题-(void)nativeRequestWithUrl:(NSString *)url params:(NSDictionary *)params successBlock:(SuccessBlock)successBlock failureBlock:(FailureBlock)failureBlock{ NSString *jsonstr = [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:params options:0 error:nil] encoding:NSUTF8StringEncoding]; AFURLSessionManager *manager=[[AFURLSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; NSMutableURLRequest *request=[[AFJSONRequestSerializer serializer]requestWithMethod:@"POST" URLString:url parameters:nil error:nil]; request.timeoutInterval=20; [request setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [request setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Accept"]; //设置body [request setHTTPBody:[jsonstr dataUsingEncoding:NSUTF8StringEncoding]]; [[manager dataTaskWithRequest:request uploadProgress:^(NSProgress * _Nonnull uploadProgress) { } downloadProgress:^(NSProgress * _Nonnull downloadProgress) { } completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { }]resume]; }@end

 

转载地址:http://drlgi.baihongyu.com/

你可能感兴趣的文章
HTTP Live Streaming直播
查看>>
rtmp+fms rtmp 视频发布环境
查看>>
最简单的基于librtmp的示例:发布(FLV通过RTMP发布)
查看>>
Windows/Linux下引用jar包,并用javac/java编译运行
查看>>
HttpClient使用详解
查看>>
HttpClient详解(一)
查看>>
httpclient 请求http数据,json转map
查看>>
git 常用命令
查看>>
用递归方法建立二叉树
查看>>
用递归方法对二叉树进行先序、中序和后序遍历
查看>>
翻转二叉树
查看>>
逆序链表
查看>>
epoll 使用详解
查看>>
stl 中 set容器用法
查看>>
有序数组求交集
查看>>
文字常量区与栈
查看>>
非阻塞connect 编写方法
查看>>
epoll 边沿触发
查看>>
String类 默认生成的函数
查看>>
Linux 软连接与硬链接
查看>>