基于AFN 3.0 封装(包括图片与视频的表单上传)
来源:互联网 发布:软件测试需要会什么 编辑:程序博客网 时间:2024/05/17 22:13
1、首先将AFN最新的包导入工程,可以使用cocopods。
2、新建一个类,我的类名GlobalNetWorking。首先封装了一下判断是否有网,具体代码如下
GlobalNetWorking.h
#import <Foundation/Foundation.h>#import "AFNetworking.h"@interface GlobalNetWorking : NSObject//判断是否有网络+(BOOL)isHasNetwork;
GlobalNetWorking.m中实现:
+(AFNetworkReachabilityStatus)currentNetworkStatus{ static AFNetworkReachabilityStatus currentNetworkStatus = AFNetworkReachabilityStatusUnknown; static dispatch_once_t predicate; dispatch_once(&predicate, ^{ /* AFNetworkReachabilityStatusUnknown = -1, // 未知 AFNetworkReachabilityStatusNotReachable = 0, // 无连接 AFNetworkReachabilityStatusReachableViaWWAN = 1, // 移动网络 AFNetworkReachabilityStatusReachableViaWiFi = 2, // WiFi */ [[AFNetworkReachabilityManager sharedManager] startMonitoring]; [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { currentNetworkStatus = status; }]; }); return currentNetworkStatus;}+(BOOL)isHasNetwork{ BOOL flag = YES; AFNetworkReachabilityStatus statue = [self currentNetworkStatus]; //无连接或未知错误返回NO if (statue == AFNetworkReachabilityStatusUnknown || statue == AFNetworkReachabilityStatusNotReachable) { flag = NO; } return flag;}
3、普通post网络请求。
GlobalNetWorking.h中:
//普通post网络请求+(void)networkWithPhpStr:(NSString *)phpStr andParametersString:(NSString *)parameters andSuccess:(void (^)(id rootObject, id datasObject, bool isSuccess))success andFailure:(void (^)(NSError *error))failure;//这里的phpStr是后台接口链接的固定拼接,parameters是传给后台数据字段的拼接。这里可以直接改成url和装有数据的字典。
GlobalNetWorking.m中
这里的+(NSDictionary *)createPostParameterDictionaryWithUrlString:(NSString *)urlStr;
这个类方法是将我上面所说的传给后台数据拼接的parameters字符串转化为字典。(所以这一步在上面可以省略,直接传入字典。)
#pragma mark - 解析生成post参数+(NSDictionary *)createPostParameterDictionaryWithUrlString:(NSString *)urlStr{ if (!urlStr || ![urlStr isKindOfClass:[NSString class]]) { return nil; } NSArray *tmpAndArray = [urlStr componentsSeparatedByString:@"&"]; NSMutableDictionary *tmpDic = [[NSMutableDictionary alloc] init]; for (NSString *tmpString in tmpAndArray) { if (![tmpString isKindOfClass:[NSString class]]) { continue; } NSArray *tmpEqualArray = [tmpString componentsSeparatedByString:@"="]; if (tmpEqualArray.count == 2) { NSString *tmpKey = [NSString stringWithFormat:@"%@", tmpEqualArray[0]]; NSString *tmpValue = [NSString stringWithFormat:@"%@", tmpEqualArray[1]]; [tmpDic setValue:tmpValue forKey:tmpKey]; } } return tmpDic;}+(void)networkWithPhpStr:(NSString *)phpStr andParametersString:(NSString *)parameters andSuccess:(void (^)(id rootObject, id datasObject, bool isSuccess))success andFailure:(void (^)(NSError *error))failure{ AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager]; sessionManager.responseSerializer = [AFHTTPResponseSerializer serializer]; NSDictionary *params = [self createPostParameterDictionaryWithUrlString:parameters]; //这里[NSString stringWithFormat:@"%@%@",HTTP_AFNETWORKING_POST_URL,phpStr]是请求的URL。在项目中进行了封装,方便管理。 [sessionManager POST:[NSString stringWithFormat:@"%@%@",HTTP_AFNETWORKING_POST_URL,phpStr] parameters:params progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSDictionary *rootDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]; //成功后进行解析,因为我所做项目中都会包含一个data字段,所以这里进行这么判断,这里的使用需要根据后台反馈的数据而定。 if (!rootDic || ![rootDic isKindOfClass:[NSDictionary class]] || ![rootDic.allKeys containsObject:@"data"]) { NSError * error = [[NSError alloc] initWithDomain:@"datasError" code:ErrorCodeNoDatasKey userInfo:@{NSLocalizedDescriptionKey:@"网络请求返回值没有datas字段!"}]; failure(error); return; } id datasValue = [rootDic objectForKey:@"data"]; BOOL isSuccess = [[rootDic valueForKey:@"status"] boolValue]; success(rootDic,datasValue,isSuccess); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { failure(error); }];}
4、进行图片上传的封装。
首先看一下我这里的需求:需要进行表单上传,其次是多张图片需要放在数组中。
代码如下:
GlobalNetWorking.h中:
//图片上传+(void)uploadImageWithPhpStr:(NSString *)phpStr andParametersString:(NSString *)parameters andImageArray:(NSArray *)imageArray andSuccess:(void (^)(id rootObject, id datasObject, bool isSuccess))success andFailure:(void (^)(NSError *error))failure;
GlobalNetWorking.m中具体实现:
+(void)uploadImageWithPhpStr:(NSString *)phpStr andParametersString:(NSString *)parameters andImageArray:(NSArray *)imageArray andSuccess:(void (^)(id, id, bool))success andFailure:(void (^)(NSError *))failure{ AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; NSDictionary *params = [self createPostParameterDictionaryWithUrlString:parameters]; NSLog(@"%@",params); [manager POST:[NSString stringWithFormat:@"%@%@",HTTP_AFNETWORKING_POST_URL,phpStr] parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { NSUInteger i = 0 ; for (UIImage *image in imageArray) { NSData * imgData = UIImageJPEGRepresentation(image, .5); //拼接data /* 此方法参数 1. 要上传的[二进制数据] 2. 对应网站上[upload.php中]处理文件的[字段"file"] 3. 要保存在服务器上的[文件名] 4. 上传文件的[mimeType] */ [formData appendPartWithFileData:imgData name:[NSString stringWithFormat:@"pic[%ld]",(long)i] fileName:@"image.png" mimeType:@"image/jpg"]; i++; } } progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSDictionary *rootDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]; if (!rootDic || ![rootDic isKindOfClass:[NSDictionary class]] || ![rootDic.allKeys containsObject:@"data"]) { NSError * error = [[NSError alloc] initWithDomain:@"datasError" code:ErrorCodeNoDatasKey userInfo:@{NSLocalizedDescriptionKey:@"网络请求返回值没有data字段!"}]; failure(error); return; } id datasValue = [rootDic objectForKey:@"data"]; BOOL isSuccess = [[rootDic valueForKey:@"status"] boolValue]; success(rootDic,datasValue,isSuccess); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { failure(error); }];}
5、视频上传的方法
视频上传和图片上传大同小异。具体如下:
GlobalNetWorking.h中:
这里我将video转换成NSData进行上传的。
//视频上传+(void)uploadVideoWithPhpStr:(NSString *)phpStr andParametersString:(NSString *)parameters andVideoData:(NSData *)videoData andSuccess:(void (^)(id rootObject, id datasObject, bool isSuccess))success andFailure:(void (^)(NSError *error))failure;
GlobalNetWorking.m中具体实现:
+(void)uploadVideoWithPhpStr:(NSString *)phpStr andParametersString:(NSString *)parameters andVideoData:(NSData *)videoData andSuccess:(void (^)(id, id, bool))success andFailure:(void (^)(NSError *))failure{ AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; NSDictionary *params = [self createPostParameterDictionaryWithUrlString:parameters]; NSLog(@"%@",params); [manager POST:[NSString stringWithFormat:@"%@%@",HTTP_AFNETWORKING_POST_URL,phpStr] parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { [formData appendPartWithFileData:videoData name:@"video" fileName:@"video.mp4" mimeType:@"video/mp4"]; } progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSDictionary *rootDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]; if (!rootDic || ![rootDic isKindOfClass:[NSDictionary class]] || ![rootDic.allKeys containsObject:@"data"]) { NSError * error = [[NSError alloc] initWithDomain:@"datasError" code:ErrorCodeNoDatasKey userInfo:@{NSLocalizedDescriptionKey:@"网络请求返回值没有data字段!"}]; failure(error); return; } id datasValue = [rootDic objectForKey:@"data"]; BOOL isSuccess = [[rootDic valueForKey:@"status"] boolValue]; success(rootDic,datasValue,isSuccess); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { failure(error); }];}
以上就是AFN 3.0 的简单的再次封装。如果有什么问题请留言,有错请指出,谢谢。
1 0
- 基于AFN 3.0 封装(包括图片与视频的表单上传)
- ios 基于AFN的图片上传
- 关于AFN的POST请求,图片上传的二次封装
- AFN(3.1.0) 图片上传 与 AFHTTPRequestOperation 上传的不同
- 图片上传(单张 多张 视频)(afn上传 原生上传)
- 封装AFN+图片上传进度在图片上显示
- ios 基于AFN的二次封装
- 基于AFN框架的多图上传
- AFN上传文件,包括语音
- AFN上传图片
- AFN上传图片
- 使用afn 上传图片
- AFN上传单张图片
- 用AFN上传图片
- AFN上传图片
- AFN与MBProgressHUD的组合封装
- 基于springmvc实现静态资源缓存(包括上传的图片文件)
- 上传图片与视频
- 怎样在配置页面加配置项
- Android启动Activity中间黑屏
- poj 2826
- ssh无密码登录设置错误
- opencv在MAC下的安装
- 基于AFN 3.0 封装(包括图片与视频的表单上传)
- HDU 3400 Line belt
- ios 利用 NSURLSession下载图片
- CGI
- 粤嵌实验室 26-利用WebView浏览网页
- WEB-INF\classes 为空 The value for the useBean class attribute xxx is invalid
- Network error IOException: Connection refused: connect
- Android studio如何使用SVN进行版本控制?
- HDU 4549 M斐波那契数列