网络编程(五)AFNetworking 的使用

一、概念
 
1、AFNetworking 是对 NSURLConnection 的封装,
 
二、简单使用
 
使用一个 AFHTTPRequestOperationManager 对象作为请求的管理者,通过它来发送请求:
 
  • 发送 GET 请求:
 
 1     //获得请求管理者
 2     AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
 3    
 4     //发送GET请求
 5     [mgr GET:@“访问的 url" parameters:nil
 6      success:^(AFHTTPRequestOperation *operation, NSDictionary *dict) { 
 7          //请求成功
 8      }
 9      failure:^(AFHTTPRequestOperation *operation, NSError *error) {
10          //请求失败
11      }];
12  

 

  • 发送 POST 请求:
 
 1      //获得请求管理者
 2     AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
 3     mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];
 4    
 5     //发送POST请求
 6     [mgr POST:@“访问的 url" parameters:@{@"type" : @"XML"}
 7      success:^(AFHTTPRequestOperation *operation, NSXMLParser *parser) {
 8         
 9      }
10      failure:^(AFHTTPRequestOperation *operation, NSError *error) {
11          //请求失败
12      }];

 

 
 
这里返回的数据默认是 json 即字典格式的,是由 AFHTTPRequestOperationManager 对象的 responseSerializer 属性决定的,这个属性默认是这样的:
 
mgr.responseSerializer = [AFJSONRequestSerializer serializer];

 

 
三、文件上传
 
 1     //获得请求管理者
 2     AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
 3    
 4     //发送请求(做文件上传)
 5     // parameters : 只能放非文件参数
 6     NSMutableDictionary *params = [NSMutableDictionary dictionary];
 7     params[@"username"] = @“用户名";
 8    
 9     [mgr POST: @“上传 url” parameters:params
10       constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
11           // 要上传的文件必须放在这里
12           NSString *file = [[NSBundle mainBundle] pathForResource:@"测试.txt" ofType:nil];
13           NSData *data = [NSData dataWithContentsOfFile:file];
14         
15           // 拼接文件参数,必须指明文件的 mimeType 类型
16           [formData appendPartWithFileData:data name:@"file" fileName:@"123.txt" mimeType:@"text/plain"];
17     }
18       success:^(AFHTTPRequestOperation *operation, id responseObject) {
19         
20     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
21        
22     }];

 

 
注意这里的参数使用,一般的非文件的参数放在 params 处,文件参数需要单独设置放到 block 中,而且必须指明文件的 mimeType 类型
 
四、监听网络状态
 
使用 对象监听网络状态的变化:
 
 1       //获得网络监控的管理者
 2     AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];
 3     //设置网络状态改变后的处理
 4     [mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
 5        
 6           // 当网络状态改变了, 就会调用这个block
 7         switch (status) {
 8             case AFNetworkReachabilityStatusUnknown: 
 9                // 未知网络
10                 break;
11                
12             case AFNetworkReachabilityStatusNotReachable: 
13                 // 没有网络(断网)
14                 break;
15                
16             case AFNetworkReachabilityStatusReachableViaWWAN: 
17                 // 手机自带网络
18                 break;
19                
20             case AFNetworkReachabilityStatusReachableViaWiFi: 
21                 // WIFI
22                 break;
23         }
24     }];
25     //开始监控
26     [mgr startMonitoring];

 

 
 
四、ASI 和 AFN 框架的比较
 
1、性能:
 
  • ASI 因为是基于底层的 CFNetwork 框架的所以性能更好
  • AFN 基于  NSURLConnection 框架性能相对弱一些
 
2、处理服务器返回数据
 
  • AFN 可以根据返回的数据类型进行自动解析数据,JSON 转换为 NSDictionary 或 NSArray,XML 转化为 NSXMLParser 
  • ASI 没有对数据进行解析,直接返回 NSData 二进制数据
 
3、处理的请求方式
 
  • AFN 含有请求成功和失败2个 block 方便使用对请求进行处理
  • ASI 有三种请求处理方式:代理方法/block方法/SEL方法
 
4、ASI 的特色
 
  • 自带缓存(AFN 使用系统的 NSURLCache)
  • 可以方便的监听请求进度,轻松实现断点下载(注意,ASI 没有断点上传)
  • ASIHttpRequest 继承自 NSOperation 所以可以使用队列统一管理所有请求,请求之间也可设置依赖
 
5、AFN 的特色
 
  • 使用简单
  • 自带网络监控功能

 

五、项目中的 AFNetworking 等第三方框架的使用

在项目中为了减少对第三方框架的依赖,一般需要在第三方框架上再封装一层工具层来请求数据,但光是这样还是不够的,更进一步还可以在网络数据请求的工具类上再封装一层数据请求工具类,在这一层工具类中判断是否有缓存,有缓存就直接使用缓存,没有缓存才需要网络请求,而数据的请求者只需要直接使用最上层的数据请求类,不需要知道要访问的数据是从何而来,如下:

 

技术分享

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。