标签:
AFN
1 AFN 的概念原理
AFN 的基础是 NSURL,AFN 的直接操作对象 AFHTTPClient是一个实现了 NSCoding 和 NSCopying协议的NSObject 的子类. AFHTTPClient是一个封装了一系列操作方法的工具类,处理请求的操作类一系列单独的,基于 NSOperation 封装的, AFURLConnectionOperation的子类.AFN 的 demo 中通过静态方法,使用 dispatic_once()方法创建 AFHTTPClient 共享实例.在创建 AFHTTPClient 中,创建了 operatioQueue并设置了一系列默认的参数值.在 getPath—parameters—successs—failure 方法中创建了 NSURLRequest, 并根据该请求创建了 NSOpreation,并加入在初始化方法中的 NSOprarationQueue 中.(注:以上操作都在主队列中完成)
需要说明的是, AFN2.0是对 NSURLConnection , NSURLSession,HTTPS网络安全请求以及网络连接管理的封装,但是到 AFN3.0的时候添加了回调并删除了 NSURLConnection 的封装,这是因为NSURLSession 可以完全代替 NSURLConnection 方法,并且具有以下特点:
2 AFN 的使用
2.1 AFN 的直接使用
> 实例化网络请求管理类
NSString *urlString = @"http://127.0.0.1/resources/vedios.xml";//url
[manager GET:urlString parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
// 这里可以获得请求的进度信息
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 成功的回调,这里就得到了数据,JSON数据会自动解析
// 如果是XML,HTML或者其它数据,需要选择不同的解析器
} } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// 失败的回调
}];
2.2 AFN 的封装
由于 AFN 只是一个框架,为避免由于 AFN 出现一个重大的 BUG 或者其他的原因,而造成的重大损失,我们一般讲 AFN 和网络请求分离开.
实现步骤
> 创建一个类继承自 AFN(假如在使用中只用到HTTP 那我们可以让这个类继承自AFHTTTPSessionManager)
> 在这个类中提供一个类方法,用于创建这个类的对象(可以用单例实现)
> 创建一个对象方法,用于进行网络请求,提供参数,可以进行 POST GET HEAD等
2.3 AFN 与其他框架
> AFN 框架是一款简单易用的框架,有人维护,使用量大
> ASIHTTPRequst :ASI 的底层是基于纯 C 语言的 CFNetworking, 功能非常的强大,但是已经停止更新
> MKNetWork: 简单易用,但使用者少.
三者的对比
2.4 AFN 和 ASI 的对比
ASI 简介
ASI的直接操作对象是ASIHTTPRequest,是一个实现了NSCopying协议的NSOperation子类,在initialize和initWithURL:方法中初始化相关属性并设置一系列请求相关参数默认值.此外,ASIHTTPRequest还提供了一系列的实例方法用来配置请求对象.
1> 底层实现
2>对服务器返回数据的处理
3>监听过程
成为代理à遵守协议à实现协议中的方法
成为代理à不遵守协议à自定义协议方法
设置 block
4> 下载和上传中的使用
5>ASI 是其他优点
3 总结
3.1 用法
3.2 AFN 返回数据解析方法
> JSON à JSON 解析器:
manager.responseSerializer = [AFJSONResponseSerializer serializer];
> XML à XML 解析器 NSXMLParser (默认是 SAX 解析)
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
> 万能解析器 NSData 解析为二进制数据
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
3.3 AFN 成功回调的要求
1.网络请求成功 2.服务器返回的必须是JSON数据 3.AFN能够解析JSON数据
3.4 常用的方法
> 改变解析器类型
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
> 增加解析器解析文件类型
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript" ,@"text/plain",nil];
3.5 实时监测网络状态
AFNetworkReachabilityManager 只要网络状态改变,都可以监测到!
下面是提供的实例:
1. 实例化网络工具监测类.
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
2. 设置网络状态改变之后的操作.
ReachabilityStatusChangeBlock:一旦网络状态改变之后,就会执行下面的 block.
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知的网络...");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"没有网络...");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"蜂窝移动网络...");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WIFI网络...");
break;
default:
break;
}
}];
3开启网络监测.
[manager startMonitoring];
3.6 iOS中发送网络请求的方式
> 苹果原生: NSURLConnection, NSURLSession:iOS7, CFNetWork:(纯C一般不用)
> 第三方: AFNetWorking, ASIHttpRequest, MKNetWorkKit.
标签:
原文地址:http://www.cnblogs.com/xuan-yuan/p/5441954.html