对比
ASI AFN
更新状态 2012年10月份,已经停止更新 持续更新中,目前已更新至3.0版
介绍
ASI的直接操作对象 ASIHTTPRequest,是一个实现了了NSCopying协议的NSOperation子类。
在initialize和initWithURL:方法中初始化相关属性并配置一系列请求相关参数默认值。此外,ASIHTTPRequest还提供了一系列的实例方法用来配置请求对象。
AFN的直接操作对象AFHTTPClient,是一个实现了NSCoding和NSCopying协议的NSObject子类。AFHTTPClient是一个封装了一系列操作方法的“工具类”,处理请求的操作类是一系列单独的,基于NSOperation封装的,AFURLConnectionOperation的子类。
线程处理模式
每一个请求都由构造方法初始化一个(共享)实例,通过这个实例配置参数并发起请求。ASI最初使用delegate模式回调,在iOSSDK支持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是基于CoreFoundation中CFStream的一个底层高性能网络框架,它由提供基础服务的CFSocketStream,支持HTTP协议的CFHTTP,基于CFHTTP用于身份认证的CFHTTPAuthentication和支持FTP协议的CFFTP组成。
Core Foundation框架中的CFSocket就是基于BSDSocket开发的。它几乎涵盖了BSD Socket的全部功能,更重要的是把Socket整合到事件的处理循环中。CoreFounda-tion中较高层的CFStream是基于CFSocket开发的读写流支持。
如图所示,ASI是基于CFHTTP开发的一个组件;而AFN的基础——NSURL,也是基于CFNetwork开发的,也就是说ASI相比AFN更加底层。
性能对比 AFN请求优于ASI  
总结 ASI更适合已经发展了一段时间的应用,或者开发资源相对丰富的团队,因为往往这些团队(或他们的应用)已经积累了一定的经验,无论是产品上还是技术上的。需求复杂度就是在这种时候高起来,而且底层订制的需求也越来越多,此时AFN就很难满足需求,需要牺牲一定的易用性,使用ASI作为网络底层控件。 AFN适合逻辑简单的应用,或者更适合开发资源尚不丰富的团队,因为AFN的易用性要比ASI好很多,而这样的应用(或团队)对底层网络控件的定制化要求也非常低。

一、底层实现

1、AFN的底层实现基于OC的NSURLConnection和NSURLSession 
2、ASI的底层实现基于纯C语言的CFNetwork框架
3、因为NSURLConnection和NSURLSession是在CFNetwork之上的一层封装,因此ASI的运行性能高于AFN

AFNetworking的下载地址: https://github.com/AFNetworking/AFNetworking

二、对服务器返回的数据处理

1、ASI没有直接提供对服务器数据处理的方式,直接返回的是NSData/NSString 
2、AFN提供了多种对服务器数据处理的方式
(1)JSON处理-直接返回NSDictionary或者NSArray 
(2)XML处理-返回的是xml类型数据,需对其进行解析
(3)其他类型数据处理

三、监听请求过程

1、AFN提供了success和failure两个block来监听请求的过程(只能监听成功和失败) 
success : 请求成功后调用 
failure : 请求失败后调用 
2、ASI提供了3套方案,每一套方案都能监听请求的完整过程 
(监听请求开始、接收到响应头信息、接受到具体数据、接受完毕、请求失败) 
成为代理,遵守协议,实现协议中的代理方法 
成为代理,不遵守协议,自定义代理方法
 设置block

四、在文件下载和文件上传的使用难易度

1、AFN 
不容易实现监听下载进度和上传进度 
不容易实现断点续传 
一般只用来下载不大的文件 
2、ASI 
非常容易实现下载和上传 
非常容易监听下载进度和上传进度 
非常容易实现断点续传 
下载大文件或小文件均可 
3、实现下载上传推荐使用ASI

五、网络监控

1、AFN自己封装了网络监控类,易使用 
2、ASI使用的是Reachability,因为使用CocoaPods下载ASI时,会同步下载Reachability,但Reachability作为网络监控使用较为复杂(相对于AFN的网络监控类来说)
3、推荐使用AFN做网络监控-AFNetworkReachabilityManager

六、ASI提供的其他实用功能

1、控制信号旁边的圈圈要不要在请求过程中转 
2、可以轻松地设置请求之间的依赖:每一个请求都是一个NSOperation对象 
3、可以统一管理所有请求(还专门提供了一个叫做ASINetworkQueue来管理所有的请求对象) 
暂停/恢复/取消所有的请求 
监听整个队列中所有请求的下载进度和上传进度

ASI与AFN网络请求的的比较相关推荐

  1. ASI进行POST网络请求

    第一步,导入文件 //ASI进行GET数据请求 需要导入的头文件是ASIHTTPRequest.h //ASI进行POST数据请求  需要导入的头文件是ASIFormDataRequest.h //都 ...

  2. afn访问本地html,Swift利用AFN实现封装网络请求详解

    前言 相信大家都知道,我们一般在一个项目中,网络请求都封装成一个单例,以确保整个项目的网络请求 Session 是同一个. 单例模式定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供,下面话不 ...

  3. IOS开发基础之网易新闻环境搭建异步请求json,AFN网络封装第1天

    IOS开发基础之网易新闻环境搭建异步请求json,AFN网络封装第1天 视频资料是2015年的,但是AFN是导入框架的关键文件,我尝试使用cocoapods安装最新的AFN,虽然成功了,但是版本太高, ...

  4. 最简单的iOS网络请求

    为什么80%的码农都做不了架构师?>>>    做iOS开发,说到网络请求,大家可能都不约而同的提到AFN,可以说大家的网络请求都是用AFN封装而成,AFN的强大易用的确很好. 但是 ...

  5. ios在异步网络请求上实现同步逻辑

    2019独角兽企业重金招聘Python工程师标准>>> 前提: 可能遇到一些问题,比如上传多个数据,需要等多个数据上传成功后做一定的处理,而且一个个上传,万一哪个上传失败了,后面就不 ...

  6. (iOS-框架封装)AFN3.x 网络请求封装

    AFNetworking 我项目里面的网络请求是一外包大牛基于AFN2.x封装的基本网络请求,感觉其封装的贼好,对服务端返回的错误码统一处理,对返回的 json 数据下发给每个继承自基本网络请求的子网 ...

  7. swift 同步 网络请求_IOS开发中异步网络请求上实现同步逻辑

    IOS开发中异步网络请求上实现同步逻辑 前提: 可能遇到一些问题,比如上传多个数据,需要等多个数据上传成功后做一定的处理,而且一个个上传,万一哪个上传失败了,后面就不需要上传了,直接报错. 之前ASI ...

  8. AFNetworking网络请求与图片上传工具(POST)

    AFNetworking网络请求与图片上传工具(POST) .h文件 #import <Foundation/Foundation.h>/** 成功Block */ typedef voi ...

  9. ios开发循环网络请求_iOS开发--HTTP的网络请求状态代码详解

    网络请求是iOS项目的一个大部分,而且大部分的iOS的项目的网络请求是根据AFN进行的二次封装,我们查看返回的结果或者error的网络错误code,从而确认错误类型,针对行的进行调试修改. 说明:一下 ...

最新文章

  1. 219. Contains Duplicate II
  2. Linux基础命令---znew
  3. AngularJS2.0 quick start——其和typescript结合需要额外依赖
  4. docker中部署Tomcat
  5. opencv笔记(3):图像镜像
  6. git log友好显示
  7. 云开发技术应用python_云开发技术应用(Python)
  8. js删除mysql记录_(DELETEUPDATE)修改、删除数据记录_MySQL
  9. 12306 的技术扒光在你面前,100 万人如何抢 1 万张票
  10. 【Day06】请画出 Css 盒模型,基于盒模型的原理,说明相对定位、绝对定位、浮动实现样式是如何实现的?
  11. linux mysql端口启动失败怎么办,Linux下apache mysql等服务修改默认端口后无法正常启动解决办法...
  12. COJ 1079 树上的查询 (离线LCA)
  13. Java 面向对象 知识点基础浅谈
  14. 查看硬盘转速_【装机帮扶站】第538期:哪些CPU、板卡、硬盘对于普通消费者而言不太值得购买?...
  15. [转]关于C#操作WPS和office兼容性的问题
  16. 使用Java程序实现计算器
  17. python背景介绍_二手房房价影响因素分析 讲解1背景介绍
  18. excel因为文件格式或文件扩展名无效,请确定文件未损坏(Excel文件格式或文件扩展名无效)...
  19. wamp mysql_wamp中如何打开mysql
  20. iOS 5 故事板入门(2)

热门文章

  1. 大话流氓软件(四):是谁把IT精英逼成了“流氓”?[转]
  2. 0715-铁矿石跌10%
  3. TreeSet的遍历
  4. 顶级NPC寻路方法 洪荒之力带你上天
  5. java什么是消息刷盘_RocketMQ刷盘策略
  6. 前端Vue书籍翻页功能利用turn.js来完成以及知识点(源码)
  7. rknn3399pro 2小时入门指南(一)基础概念和基本开发流程
  8. 安装openSuSE 11.0及其AMD Atheros AR8151网卡驱动
  9. dreamweaver郑州旅游网页设计制作 简单静态HTML网页作品 我的家乡网页作业成品 学生旅游网站模板...
  10. xml与Html兄弟情深