AFNetworking 2.0 来了
转:http://yangfei.me/blog/afnetworking-2-came/
前几天 Mattt 发布了 AFNetworking 2.0,我的一个最大感慨就是,他怎么那么高产?
关于 Mattt
Mattt 是一位非常活跃的 iOS 开发大牛,从 AFNetworking 1.0 开始 follow 他。当时从他 AFNetworking 和 TTTAttributedLabel 等开源代码中学到了很多。他现在是 Heroku 的 Mobile Lead。
我一直觉得一个团队要想为开发者提供优秀的服务,这个团队本身应该足够 hacker 足够酷,比如 Github,这群人以及他们所做的事真的是非常帅。 Heroku 也不错,他们的首席架构师就是 Ruby 之父松本行弘,他们让 Web 开发变得如此的轻松。
我觉得 Mattt 确实是个 hacker,并且是个非常具有开源精神的 hacker。他的很多项目我都觉得非常有趣,这里列出一些。更多信息关注他的Github账号(@mattt)和Twitter账户(@mattt)。
- asciiwwdc – searchable full-text transcripts of WWDC sessions
- afnetworking 2.0 – a delightful networking library for iOS and Mac OS X
- nshipster – a journal of the overlooked bits in Objective-C and Cocoa
- helios – an extensible open-source mobile backend framework
- nomad – world-class command line utilities for iOS development
- rocket – a hybrid approach to real-time cloud applications
关于 AFNetworking
AFNetworking 是一个用于 iOS 和 OS X 开发的网络请求框架,始于 2011 年 5月,那时候 Mattt 还在 Gowalla (Foursquare的竞争对手,后被Facebook收购)工作。基于苹果的一个Demo MVCNetworking,Mattt
开始了 AFNetworking。当时 ASIHTTPRequest 还很流行,但很快更多的程序员发现 AFNetwoking 是更为现代的解决方案,所以它逐渐开始流行。现在,AFNetworking 有 9000+ stars,2300+ forks,是 Objective-C 开源社区最火的框架。
重点介绍 AFNetworking 2.0
AFNetworking 在易用性和扩展性之间平衡得非常好,但这并不是说它没有改进的空间。AFNetworking 2.0 的目标是调整原始设计中的一些奇怪的地方,同时添加强大的新架构,帮助新一代的应用程序变得更为强大。
1.目的
兼容 NSURLSession
在 iOS7 中 NSURLConnection 被 NSURLSession 取代,但 NSURLConnection 并没有被 deprecated,在一段时间内依然可用。不过,NSURLSession 才是未来,它解决了 NSURLConnection 的很多缺点。有人可能会说有 NSURLSession 还需要 AFNetworking 么,二者确实有重叠的地方,但 AFNetworking 作为一个更上层的抽象类,能提供的更多。2.0 兼容并扩展了 NSURLSession,铺平其中艰难的路线,最大限度的提高了易用性。
模块化
AFNetworking 1.0 被批评的一个地方是,它有点臃肿。其实 1.0 在类的层次上很具有模块化,但文件封装的不够方便,没办法单独分离出某个功能模块。随着时间的推移,特别是像 AFHTTPClient 这样的类,会变得很臃肿(创建请求,序列化请求参数,响应和解析,创建和管理各种操作,监控网络的可用性等都堆在一起)。在 2.0 中,你可以只挑选你需要的模块,可以通过 CocoaPods subspecs 使用,很方便。
实时
2.0 遵循 Rocket 技术,Rocket 是在现有的 REST 服务器之上,通过一些 Web 标准(如Server-Sent Events,JSON Patch),实现实时的数据更新,详情参考前文列表中的链接。
2. 实现
NSURLConnection (iOS 6 & 7)
AFURLConnectionOperation–
它继承于 NSOperation,负责管理 NSURLConnection,实现它的 delegate 方法。AFHTTPRequestOperation–
它继承于 AFURLConnectionOperation,专门用于创建 HTTP 请求。2.0 的主要区别就是可以直接使用它,而不用再继承它,原因将会在下面的 Serialization 处解释。AFHTTPRequestOperationManager–
封装 HTTP 请求的常见方式,GET / POST / PUT / DELETE / PATCH……
NSURLSession (iOS 7)
AFURLSessionManager–
创建和管理 NSURLSession 对象,以及此对象的数据和下载/上传等任务,实现对象和任务的代理方法。NSURLSession 的 API 本身有一些局限,AFURLSessionManager 能使其变得更好用。AFHTTPSessionManager–
它继承于 AFURLSessionManager,封装了 HTTP 请求的常见方式,GET / POST / PUT / DELETE / PATCH……总的来说:为了支持最新的 NSURLSession 接口,同时兼容旧的 NSURLConnection,2.0 的核心组件将“网络请求”和“任务处理”分离。 AFHTTPRequestOperationManager 和 AFHTTPSessionManager 提供相似的功能,切换很方便,所以从 iOS 6 移植到 iOS 7 会很容易。之前绑在
AFHTTPClient 里的 serialization、security 和 reachability 模型都被分离了出来,基于 NSURLSession 和 NSURLConnection 的 API 都可复用这些模型。
序列化(Serialization)
2.0 架构的一个突破就是,请求和解析的可序列化。序列化的灵活性允许在网络层添加更多的商业逻辑,自定义更方便。<AFURLRequestSerializer> 和 <AFURLResponseSerializer> 这两个协议,让你在
1.0 中的一些抱怨不复存在。
安全
AFNetworking 支持 SSL pinning。这对涉及敏感数据的 App 很重要。
AFSecurityPolicy–
这个类通过特定证书和公共密钥评估链接的安全性和可信任度。在你的 App bundle 中添加服务器证书有助于防止“中间人攻击”。
可达性(Reachability)
另一个从 AFHTTPClient 中分离的功能是网络的可达性。现在你可以单独使用它,或者作为 AFHTTPRequestOperationManager / AFHTTPSessionManager 的一个属性。
AFNetworkReachabilityManager–
负责监控当前的网络可达性,当网络的可达性发生改变时,提供相应的 callback 和通知。
实时
AFEventSource–
用 Objective-C 实现的 EventSource DOM API。客户端和服务器建立一个长链接,服务器会把新的 Event 实时推给客户端。客户端收到的信息格式是JSON Patch,然后
JSON Patch 被转化为 AFJSONPatchOperation 对象。示例代码参考:
|
UIKit 扩展
2.0 的中所有 UIKit 扩展都被分离出来并进行了增强。
AFNetworkActivityIndicatorManager:
新增自动开始或结束状态栏上的网络指示器。UIImageView+AFNetworking:
新增显示图片前剪裁或者加滤镜的功能。UIButton+AFNetworking(新增):
类似 UIImageView+AFNetworking,按钮的背景图从线上下载。UIActivityIndicatorView+AFNetworking(新增):
根据网络请求的状态自动开始或结束。UIProgressView+AFNetworking(新增):
自动跟踪某个请求的上传下载的进度。UIWebView+AFNetworking(新增):
支持网络请求的进度和内容转换。
3. 使用
在 CocoaPods 中使用 AFNetworking 2.0:
|
如果之前你是用 1.0,这个《AFNetworking 2.0 迁移指南》应该会有帮助。
最后
AFNetworking 2.0 是一次非常有价值的更新,谢谢 Mattt 带来这么棒的开源项目。在互联网领域,要想成为牛人,除了聪明和勤奋,我想一定少不了分享和交流,那些具有开源精神的人,那些喜欢和不同人、不同想法碰撞的人,才有可能走在时代的前沿。
AFNetworking 2.0 来了的更多相关文章
- AFNetworking 3.0 源码解读 总结(干货)(下)
承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...
- AFNetworking 3.0 源码解读(十一)之 UIButton/UIProgressView/UIWebView + AFNetworking
AFNetworking的源码解读马上就结束了,这一篇应该算是倒数第二篇,下一篇会是对AFNetworking中的技术点进行总结. 前言 上一篇我们总结了 UIActivityIndicatorVie ...
- AFNetworking 3.0 源码解读(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking
我们应该看到过很多类似这样的例子:某个控件拥有加载网络图片的能力.但这究竟是怎么做到的呢?看完这篇文章就明白了. 前言 这篇我们会介绍 AFNetworking 中的3个UIKit中的分类.UIAct ...
- AFNetworking 3.0 源码解读(九)之 AFNetworkActivityIndicatorManager
让我们的APP像艺术品一样优雅,开发工程师更像是一名匠人,不仅需要精湛的技艺,而且要有一颗匠心. 前言 AFNetworkActivityIndicatorManager 是对状态栏中网络激活那个小控 ...
- AFNetworking 3.0 源码解读(八)之 AFImageDownloader
AFImageDownloader 这个类对写DownloadManager有很大的借鉴意义.在平时的开发中,当我们使用UIImageView加载一个网络上的图片时,其原理就是把图片下载下来,然后再赋 ...
- AFNetworking 3.0 源码解读(七)之 AFAutoPurgingImageCache
这篇我们就要介绍AFAutoPurgingImageCache这个类了.这个类给了我们临时管理图片内存的能力. 前言 假如说我们要写一个通用的网络框架,除了必备的请求数据的方法外,必须提供一个下载器来 ...
- AFNetworking 3.0 源码解读(六)之 AFHTTPSessionManager
AFHTTPSessionManager相对来说比较好理解,代码也比较短.但却是我们平时可能使用最多的类. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilit ...
- AFNetworking 3.0 源码解读(三)之 AFURLRequestSerialization
这篇就讲到了跟请求相关的类了 关于AFNetworking 3.0 源码解读 的文章篇幅都会很长,因为不仅仅要把代码进行详细的的解释,还会大概讲解和代码相关的知识点. 上半篇: URI编码的知识 关于 ...
- AFNetworking 3.0 源码解读(四)之 AFURLResponseSerialization
本篇是AFNetworking 3.0 源码解读的第四篇了. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3 ...
- AFNetworking 3.0 源码解读(五)之 AFURLSessionManager
本篇是AFNetworking 3.0 源码解读的第五篇了. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3 ...
随机推荐
- Oracle的学习一:安装与卸载、sql *plus常用命令、Oracle用户管理
1.为什么学习oracle? 性能优越: 小型数据库 中型数据库 大型数据库 acess.foxbase mysql.sql server.informix sybase.oracle.db2 复杂量 ...
- 深入理解JVM--类的执行机制
在完成将class文件信息加载到JVM并产生class对象之后,就可以执行Class对象的静态方法或者实例方法对对象进行调用了.JVM在源代码编译阶段将源代码编译为字节码文件,字节码是一种中间代码的方 ...
- 李洪强iOS开发之零基础学习iOS开发】【02-C语言】01-概述
前面已经给大家介绍了iOS开发相关的一些基础知识,其实iOS开发就是开发iPhone\iPad上的软件,而要想开发一款软件,首先要学习程序设计语言.iOS开发需要学习的主要程序设计语言有:C语言.C+ ...
- lintcode 中等题:Palindrome Linked List 回文链表
题目 回文链表 设计一种方式检查一个链表是否为回文链表. 样例 1->2->1 就是一个回文链表. 挑战 O(n)的时间和O(1)的额外空间. 解题 法一: 再定义一个链表,存放链表反转的 ...
- 用React.addons.TestUtils、Jasmine进行单元测试
一.用到的工具 1.React.addons.TestUtils 2.Jasmine 3.Browserify(处理jsx文件的require依赖关系) 4.Reactify(能和browserify ...
- XE2编译出来的DLL的DLLMain的退出地方用到了halt0
DelphiXE2内存加模块升级版.支持32位和64位模块. 已转至新的博客 http://www.raysoftware.cn/?p=51 很多年以前写过内存加载DLL的一片技术. http://b ...
- Android关于实现EditText中加多行下划线的的一种方法
1. 重写EditText public class LinedEditText extends EditText { private Paint linePaint; private float m ...
- win7右下角声音图标不见的解决方法
1.启动任务管理器 2.在进程选项卡里找到"explorer.exe",然后结束该进程 3.接着点击应用程序选项卡,点击新任务 4.输入explorer.exe,然后点击确定 5. ...
- 【原创】Sliding Window Maximum 解法分析
这道题是lintcode上的一道题,当然leetcode上同样有. 本题需要寻找O(N)复杂度的算法. 解体思路比较有特点,所以容易想到参考 最小栈 的解题办法. 但是最小栈用栈维护最小值很直观,这道 ...
- 10个用于Web开发的最好 Python 框架
Python 是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准 库也是值得大家称赞的,Python甚至还 ...