博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AFN
阅读量:6072 次
发布时间:2019-06-20

本文共 4152 字,大约阅读时间需要 13 分钟。

在iOS开发中,发送http请求的方案有很多,常见的有如下几种:

        <1> 苹果原生:

        {

            * NSURLConnection:用法简单,古老经典的一种方案

            * NSURLSession:iOS7以后推出的技术,功能比NSURLConnection更加强大.

            * CFNetWork:NSURL 的底层,纯C语言,一般不用.

        }

        <2> 第三方框架:

        {

            * ASIHttpRequest:http终结者,功能很强大,可惜作者已停止更新.

            * AFNetWorking:简单易用,提供了基本够用的常用功能,维护和使用者多 

            * MKNetWorkKit:简单易用,产自印度,维护和使用者少.

        }           

ASI和AFN(2.0)以及底层框架的关系 

 

 

对比

ASI

AFN(2.0版本)

更新状态

2012年10月份,已经停止更新

持续更新中,目前已更新至3.0版

介绍

ASI的直接操作对象ASIHTTPRequest,是一个实现了了NSCopying协议的NSOperation子类。

在initialize和initWithURL:方法中初始化相关属性并配置一系列请求相关参数默认值。此外,ASIHTTPRequest还提供了一系列的实例方法用来配置请求对象。

AFN的直接操作对象AFHTTPClient,是一个实现了NSCoding和NSCopying协议的NSObject子类。AFHTTPClient是一个封装了一系列操作方法的“工具类”,处理请求的操作类是一系列单独的,基于NSOperation封装的,AFURLConnectionOperation的子类。

线程处理模式

每一个请求都由构造方法初始化一个(共享)实例,通过这个实例配置参数并发起请求。ASI最初使用delegate模式回调,在iOS SDK支持Block之后也提供了注册Block的实例方法。

ASI采取的是CFHTTP请求完成,直接回调ASIHTTPRequest的实例方法,通过储存的实例对象记录的信息完成Delegate模式或Block模式的回调。

 

在异步请求的处理上,ASIHTTPRequest对象初始化结束后,在startAsynchronous方法中把对象加入共享操作队列。此后,包括创建CFHTTPMessageRef,也就是处理网络请求的主要对象(事实上是一个指向__CFHTTPMessage结构的指针),在内的所有操作都在ASIHTTPRequest对象所属的子线程中完成。

AFN的示例代码中通过一个静态方法,使用dispatch_once()的方式创建AFHTTPClient的共享实例,这也是官方建议的使用方法。在创建AFHTTPClient的初始化方法中,创建了OperationQueue并设置一系列参数默认值。在getPath:parameters:success:failure方法中创建NSURLRequest,以NSURLRequest对象实例作为参数,创建一个NSOperation,并加入在初始化发方中创建的NSOperationQueue。

以上操作都是在主线程中完成的。在NSOperation的start方法中,以此前创建的NSURLRequest对象为参数创建NSURLConnection并开启连结。

数据处理模式

ASI在这方面显得更原始,没有针对任何数据类型做特别封装,只是预留了各种接口和工具供开发者自行扩展。

AFN针对JSON、XML、PList和Image四种数据结构封装了各自处理器,开发者可以把处理器注册到操作队列中,直接在回调方法中获得格式化以后的数据。

同步请求

ASI则是直接通过调用一个startSynchronous方法。

 

AFN默认没有封装同步请求,如果开发者需要使用同步请求,则需要重写getPath:parameters:success:failure方法,对AFHTTPRequestOperation进行同步处理

异步回调的处理

【使用AFNetworking进行网络异步请求时,block:(void(^)代码块实际返回到UI主线程中。即使在子线程中使用AFNetWorking进行网络的异步请求,block:(void(^)代码块仍然返回到UI主线程中(AF框架,它里面已经create了异步线程 )。因此无论当前处在主线程还是子线程,异步返回均返回到UI主线程中。】

为一系列相关的请求定义一个HTTPClient,共用一个BaseURL。每次请求把URL中除BaseURL的Path部分做为参数传给HTTPClient的静态方法,并注册一个Block用于回调。

AFN则直接使用了NSOperation的completionBlock属性。

基于的底层开发框架

 

CFNetwork框架

使用CFnetwork而不是Cocoa框架NSURL有几点好处。CFNetwork更加专注于网络协议,而NSURL更加专注于数据访问,比如通过HTTP或者FTP传输数据。尽管NSURL的确也提供了一些可配置功能,可是CFNetwork提供的要多的多。另外NSURL还需要你使用Objective_c。如果做不到这点的话,还是应该使用CFNetwork

NSURL

【使用iOS5.0 SDK NSURLConnection:

 1、进行网络同步请求(sendSynchronousRequest)时,调用该请求接口的操作在哪个线程,同步返回的网络结果就处于哪个线程,因此通常进行网络同步请求时,为了避免阻塞UI主线程,需要在子线程中进行网络请求;

2、进行网络异步请求(sendAsynchronousRequest)时,block:(void(^)代码块实际返回到子线程中。因此,此时如需要向UI线程发送通知,则需要跳转到主线程中发送通知dispatch_async(dispatch_get_main_queue(), ^{});】

底层开发矿建介绍

CFNetwork是基于Core Foundation中CFStream的一个底层高性能网络框架,它由提供基础服务的CFSocketStream,支持HTTP协议的CFHTTP,基于CFHTTP用于身份认证的CFHTTPAuthentication和支持FTP协议的CFFTP组成。

Core Foundation框架中的CFSocket就是基于BSD Socket开发的。它几乎涵盖了BSD Socket的全部功能,更重要的是把Socket整合到事件的处理循环中。Core Founda-tion中较高层的CFStream是基于CFSocket开发的读写流支持。

如图所示,ASI是基于CFHTTP开发的一个组件;而AFN的基础——NSURL,也是基于CFNetwork开发的,也就是说ASI相比AFN更加底层。

性能对比

AFN请求优于ASI

 

总结

ASI更适合已经发展了一段时间的应用,或者开发资源相对丰富的团队,因为往往这些团队(或他们的应用)已经积累了一定的经验,无论是产品上还是技术上的。需求复杂度就是在这种时候高起来,而且底层订制的需求也越来越多,此时AFN就很难满足需求,需要牺牲一定的易用性,使用ASI作为网络底层控件。

AFN适合逻辑简单的应用,或者更适合开发资源尚不丰富的团队,因为AFN的易用性要比ASI好很多,而这样的应用(或团队)对底层网络控件的定制化要求也非常低。

 

AFN 主要用来发送网络请求. 特点: 会自动/默认解析 JSON 数据!

AFHTTPRequestOperationManager: 封装的是 NSUrlConnection ; 3.0之后已经被舍弃.

   // iOS 9.0 之前使用最多的一个类. 类似于 AFHTTPSessionManager (封装的是 NSUrlSession),专门用来发送网络请求的!

   // AFNetworkReachabilityManager :用来实时监测当前网络状态的!

   // AFSecurityPolicy :安全策略:支持 HTTPS 请求.

// 利用 AFN 发送最简单的网络请求.

   // 1. 实例化网络请求管理类.

   AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  

   // 2. 选择请求方法,发送网络请求.

   // NSString *urlString = @"";

   // NSString *urlString = @"";

   NSString *urlString = @"http://127.0.0.1/resources/vedios";

   // parameters :参数字典

   // progress :进度. AFN 3.0 之后推出的. 没有任何用处!

   // success :成功回调.{成功的要求: 1.网络请求成功; 2.服务器返回的必须是 JSON 数据; 3.自己(AFN)还能够解析 JSON数据}

   [manager GET:urlString parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {

       //

   } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

       // responseObject :默认就是 JSON 解析之后的数据!

       NSLog(@"success:responseObject: %@",responseObject);

       

   } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

       // 不满足成功的三个要求,就是失败!

       NSLog(@"error:%@",error);

   }];

转载于:https://www.cnblogs.com/ritian/p/5422824.html

你可能感兴趣的文章
打印机ip
查看>>
页面接口防刷 解决思路一nginx
查看>>
php接口的问题
查看>>
《MySQL入门很简单》学习笔记1——概论,数据类型,操作数据库
查看>>
jvm生命周期之类的加载、连接、初始化
查看>>
centos6安装memcached,并配置php扩展
查看>>
智慧锅炉物联网云平台方案
查看>>
Mac修改开机启动项
查看>>
MySQL日志文件
查看>>
设置wifi打开或者关闭
查看>>
《快学Scala》勘误表
查看>>
安装php扩展 ffmpeg-php
查看>>
隐藏的数据类型-引用
查看>>
struts2自动跳转求解啊啊啊啊啊啊啊啊啊啊啊啊
查看>>
朱蓓蓓--秦时明月的触控之路
查看>>
开源 免费 java CMS - FreeCMS-信息页静态化参数
查看>>
NoSQL 学习笔记
查看>>
Java BIO、NIO、AIO 比较
查看>>
webservice ssl 2 keyStore和truststore区别
查看>>
设置textarea的光标
查看>>