[iOS多线程&网络-4.0]-AFN框架简单使用

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

A.AFN基本知识

1.概念

AFNetworking是对NSURLConnection的封装运行效率没有ASI高(因为ASI基于CFNetwork),但是使用简单AFN支持ARC

B.基本请求使用

1.基本使用

(1)头文件 AFNetworking.h

(2)管理者类:AFHTTPRequestOperationManager

(3)“GET”方法发送GET请求,使用“POST”方法发送POST请求

(4)使用字典发送参数

(5)block处理请求成功/失败

1/** 发送 GET/POST 请求*/2- (void) sendNormalRequest {3//1.创建请求 管理者4AFHTTPRequestOperationManager *manager =[AFHTTPRequestOperationManager manager];56//2.设置参数7NSMutableDictionary *param =[NSMutableDictionary dictionary];8param[@"user"] =@"tom";9param[@"passWord"] =@"123";1011//3.发送请求12////3.1 GET请求13//[manager GET:@"http://192.168.0.21:8080/MyTestServer/login" parameters:param success:^(AFHTTPRequestOperation *operation, id responSEObject) {14//NSLog(@"请求成功");15//NSLog(@"%@", responseObject);16//} failure:^(AFHTTPRequestOperation *operation, NSError *error) {17//NSLog(@"请求失败");18//NSLog(@"%@", error);19//}];2021//3.2 POST请求22[manager POST:@"http://192.168.0.21:8080/MyTestServer/login"parameters:param success:^(AFHTTPRequestOperation *operation,idresponseObject) {23NSLog(@"请求成功");24NSLog(@"%@", responseObject);25} failure:^(AFHTTPRequestOperation *operation, NSError *error) {26NSLog(@"请求失败");27NSLog(@"%@", error);28}];29}

2.为了方便查看服务器返回的中文数据,给数组和字典增加一个分类,支持中文

1#import<Foundation/Foundation.h>23@implementationNSDictionary (Log)45/** 本地化显示*/6- (NSString *)descriptionWithLocale:(id)locale {7NSMutableString *str = [NSMutableStringstring];89[str appendString:@"{\n"];1011//遍历字典12[self enumerateKeysAndObjectsUsingBlock:^(idkey,idobj, BOOL *stop) {13[str appendFormat:@"\t%@ = %@,\n", key, obj];14}];1516[str appendString:@"}"];1718//取出最后一个“,”19NSRange range = [str rangeOfString:@","options:NSBackwardsSearch];20[str deleteCharactersInRange:range];2122returnstr;23}2425@end2627@implementationNSArray (Log)2829- (NSString *)descriptionWithLocale:(id)locale {30NSMutableString *str = [NSMutableStringstring];3132[str appendString:@"[\n"];3334//遍历数组所有元素35[self enumerateObjectsUsingBlock:^(idobj, NSUInteger idx, BOOL *stop) {36[str appendFormat:@"%@, \n", obj];37}];3839[str appendString:@"]"];4041returnstr;42}4344@end

3.解析返回的json数据

AFHTTPRequestOperationManager 依靠设置序列化器来自动识别、解析返回的数据默认使用的就是json解析,可以不用设置序列化器会把json自动转换成为字典或者数组输出1/** 返回json数据*/2- (void) getJson {3//1.创建请求 管理者4AFHTTPRequestOperationManager *manager =[AFHTTPRequestOperationManager manager];56//设置序列化器7//[manager setResponseSerializer:[AFJSONResponseSerializer serializer]];//默认89//2.设置参数10NSMutableDictionary *param =[NSMutableDictionary dictionary];11param[@"type"] =@"json";1213//3.发送请求14[manager GET:@"http://192.168.0.21:8080/MyTestServer/video"parameters:param success:^(AFHTTPRequestOperation *operation,idresponseObject) {15NSLog(@"请求成功");16NSLog(@"返回的数据类型是:%@", [responseObjectclass]);17NSLog(@"%@", responseObject);18} failure:^(AFHTTPRequestOperation *operation, NSError *error) {19NSLog(@"请求失败");20NSLog(@"%@", error);21}];22}

output:

2015-01-30 03:34:14.817 AFNBasicDemo[1889:192783] 请求成功

2015-01-30 03:34:14.817 AFNBasicDemo[1889:192783] 返回的数据类型是:__NSCFDictionary

2015-01-30 03:34:14.818 AFNBasicDemo[1889:192783] {

videos = [

{

name = 驯龙高手1,

video = videos/1.MP4,

length = 16秒,

image = images/[20150124-180852-0].PNG

},

...

4.解析返回的xml数据

设置使用xml序列化器,也可以自动将xml数据转换成为字典或者数组

如果不设置xml序列化器,处理返回数据会失败

1/** 返回xml数据*/2- (void) getXml{3//1.创建请求 管理者4AFHTTPRequestOperationManager *manager =[AFHTTPRequestOperationManager manager];56//设置序列化器7[manager setResponseSerializer:[AFXMLParserResponseSerializer serializer]];89//2.设置参数10NSMutableDictionary *param =[NSMutableDictionary dictionary];11param[@"type"] =@"xml";121314//3.发送请求15__weaktypeof(self) vc =self;16[manager GET:@"http://192.168.0.21:8080/MyTestServer/video"parameters:param success:^(AFHTTPRequestOperation *operation,idresponseObject) {17NSLog(@"请求成功");18NSLog(@"返回的数据类型是:%@", [responseObjectclass]);1920NSXMLParser *parser = (NSXMLParser *) responseObject;21parser.delegate=vc;22[parser parse];23} failure:^(AFHTTPRequestOperation *operation, NSError *error) {24NSLog(@"请求失败");25NSLog(@"%@", error);26}];27}

C.文件下载/上传

1.文件下载

也是简单发送请求但是没有ASI那样的监听功能

1- (void) downloadFile {2//1.创建请求管理者3AFHTTPRequestOperationManager *manager =[AFHTTPRequestOperationManager manager];45//设置序列化器6[manager setResponseSerializer:[AFHTTPResponseSerializer serializer]];//使用二进制数据序列化78//3.发送请求9[manager GET:@"http://192.168.0.21:8080/MyTestServer/images/images.zip"parameters:nil success:^(AFHTTPRequestOperation *operation,idresponseObject) {1011NSLog(@"请求成功");12NSLog(@"返回的数据类型是:%@", [responseObjectclass]);1314NSString *cachePath =[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];15NSString *filePath = [cachePath stringByAppendingPathComponent:@"download.zip"];16NSData *data = (NSData *) responseObject;17[data writeToFile:filePath atomically:YES];1819} failure:^(AFHTTPRequestOperation *operation, NSError *error) {20NSLog(@"请求失败");21NSLog(@"%@", error);22}];23}

2.文件上传

使用POST请求,带formData的post方法要区分普通参数和文件参数,把文件数据放在普通参数中上传是不行的文件放在block参数中赋值(1)把文件转换成二进制数据

(2)拼接文件参数

1/** 上传文件*/2- (void) uploadFile {3//1.创建请求管理者4AFHTTPRequestOperationManager *manager =[AFHTTPRequestOperationManager manager];56//2.设置参数7NSMutableDictionary *param =[NSMutableDictionary dictionary];8param[@"user"] =@"uploader";910//3.设置上传文件11NSString *filePath = [[NSBundle mainBundle] pathForResource:@"M2.jpg"ofType:nil];12NSData *fileData =[NSData dataWithContentsOfFile:filePath];1314//4.上传文件15__weaktypeof(fileData) uploadData =fileData;1617[manager POST:@"http://192.168.0.21:8080/MyTestServer/upload"parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData>formData) {1819//拼接文件数据20[formData appendPartWithFileData:uploadData name:@"uploadedFile"fileName:@"my_pic.jpg"mimeType:@"image/jpg"];2122} success:^(AFHTTPRequestOperation *operation,idresponseObject) {23NSLog(@"上传成功 ---- %@", responseObject);24} failure:^(AFHTTPRequestOperation *operation, NSError *error) {25NSLog(@"上传失败 ---- %@", error);26}];27}

D.网络状态监控

AFNetworkReachabilityManager

(1)创建网络监控管理者

(2)设置监控网络状态变化

(3)开启监控

(4)也可以主动去获取网络状态

1- (IBAction)monitorNetwork:(UIButton *)sender {2//1.创建网络状态监控管理者3AFNetworkReachabilityManager *manager =[AFNetworkReachabilityManager sharedManager];45//2.网络状态改变事件(被动检测)6[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {7switch(status) {8caseAFNetworkReachabilityStatusUnknown:9NSLog(@"转换为未知网络");10

break;11caseAFNetworkReachabilityStatusReachableViaWWAN:12NSLog(@"转换为手机网络");13

break;14caseAFNetworkReachabilityStatusReachableViaWiFi:15NSLog(@"转换为WIFI网络");16

break;17caseAFNetworkReachabilityStatusNotReachable:18NSLog(@"转换为没有网络");19

break;2021default:22

break;23}24}];2526//开启监控27[manager startMonitoring];2829//主动检测30if([manager isReachable]) {31NSLog(@"现在有网络");32}elseif([manager isReachableViaWiFi]) {33NSLog(@"现在是通过wifi上网");34}elseif([manager isReachableViaWWAN]) {35NSLog(@"现在是通过手机网络上网");36}else{37NSLog(@"现在没有网络");38}39}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航