4000-520-616
欢迎来到免疫在线!(蚂蚁淘生物旗下平台)  请登录 |  免费注册 |  询价篮
主营:原厂直采,平行进口,授权代理(蚂蚁淘为您服务)
咨询热线电话
4000-520-616
当前位置: 首页 > 新闻动态 >
新闻详情
iOS之AFNetWorking基本用法(一)_代码解释生活-CSDN博客
来自 : CSDN技术社区 发布时间:2021-03-25
#import Foundation/Foundation.h 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 AFMultipartFormData _Nonnull formData) { // formData: 专门用于拼接需要上传的数据,在此位置生成一个要上传的数据体 //上传方法一 for (int i 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 Foundation/Foundation.h 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 AFMultipartFormData _Nonnull formData) { // formData: 专门用于拼接需要上传的数据,在此位置生成一个要上传的数据体 //上传方法一 for (int i 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 AFMultipartFormData _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 [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://afnm.immuno-online.com/view-748633.html

发布于 : 2021-03-25 阅读(0)
公司介绍
品牌分类
催化剂和助剂 Others
联络我们
服务热线:4000-520-616
(限工作日9:00-18:00)
QQ :1570468124
手机:18915418616