zoukankan      html  css  js  c++  java
  • 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.

     

  • 相关阅读:
    React.Fragment
    微信分享
    视频H5 video标签最佳实践
    详解vue2.0+vue-video-player实现hls播放全过程
    call()和appl()的理解
    JS 原生面经从初级到高级
    vue面试
    面试题2
    IdentityServer4 实现 OpenID Connect 和 OAuth 2.0
    DDD关键知识点整理汇总
  • 原文地址:https://www.cnblogs.com/xuan-yuan/p/5441954.html
Copyright © 2011-2022 走看看