AFN

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 方法,并且具有以下特点:

  • 支持后台运行的网络任务
  •    暂停、停止、重启网络任务,不需要自己封装NSOperation
  •    支持断点续传,异步下载
  •    支持上传,异步上传
  •    获取下载、上传的进度

2 AFN 的使用

2.1 AFN 的直接使用

> 实例化网络请求管理类

  • AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  • > 选择请求方法发送请求

    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> 底层实现

  • Ø AFN是基于 OC 的 NSURLConnection 和 NSURLSession
  • Ø ASI 是基于 C的 CFNetWork 框架
  • Ø ASI 的执行性能高于 AFN

2>对服务器返回数据的处理

  • Ø ASI 没有提供腿服务器返回数据的处理,返回的直接是 data/string
  • Ø AFN 提供了多种处理数据的方式, JSON(默认),XML和其他数据处理

3>监听过程

  • Ø AFN 监听请求结果 successs(成功block回调)和 failure(失败block回调).
  • Ø ASI 提供了三套方案,可以监听整个请求过程(包括:开始,进程,结果:成功和失败)

成为代理à遵守协议à实现协议中的方法

成为代理à不遵守协议à自定义协议方法

设置 block

4> 下载和上传中的使用

  • Ø AFN 下载小文件和上传单文件,不能用于监听(上传和下载),也不能断点续传.
  • Ø ASI 可以用来监听上传和下载,可以断点续传,可以下载比较大的文件.

5>ASI 是其他优点

3 总结

3.1 用法

  • Ø AFNetworkReachabilityManager:实时监测网络状态(只要网络状态改变都可以监测到)
  • Ø AFSecurityPolicy:安全策略,支持 HTTPS 请求
  • Ø AFN 是用来发送网络请求

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.

 

原文地址:https://www.cnblogs.com/xuan-yuan/p/5441954.html