AFNetworking2.0 NSHipster翻译
AFNetworking 是当前 iOS 和 Mac OS X 开发中最广泛使用的开源项目之一。它帮助了成千上万叫好又叫座的应用,也为其它出色的开源库提供了基础。这个项目是社区里最活跃、最有影响力的项目之一,拥有 8700 个 star、2200 个 fork 和 130 名贡献者。
从各方面来看,AFNetworking 几乎已经成为主流。
但你有没有听说过它的新版呢?
AFNetworking 2.0。
这一周的 NSHipster:独家揭晓 AFNetworking 的未来。
声明:NSHipster 由 AFNetworking 的作者 撰写,所以这并不是对 AFNetworking 及它的优点的客观看法。你能看到的是个人关于 AFNetworking 目前及未来版本的真实看法。
AFNetworking 的大体思路
始于 2011 年 5 月,AFNetworking 作为一个已死的 LBS 项目中对 Apple 范例代码的延伸,它的成功更是由于时机。彼时ASIHTTPRequest 是网络方面的主流方案,AFNetworking 的核心思路使它正好成为开发者渴求的更现代的方案。
NSURLConnection + NSOperation
NSURLConnection 是 Foundation URL 加载系统的基石。一个 NSURLConnection 异步地加载一个 NSURLRequest 对象,调用 delegate 的 NSURLResponse / NSHTTPURLResponse 方法,其 NSData 被发送到服务器或从服务器读取;delegate 还可用来处理NSURLAuthenticationChallenge、重定向响应、或是决定 NSCachedURLResponse 如何存储在共享的 NSURLCache 上。
NSOperation 是抽象类,模拟单个计算单元,有状态、优先级、依赖等功能,可以取消。
AFNetworking 的第一个重大突破就是将两者结合。AFURLConnectionOperation 作为 NSOperation 的子类,遵循NSURLConnectionDelegate 的方法,可以从头到尾监视请求的状态,并储存请求、响应、响应数据等中间状态。
Blocks
iOS 4 引入的 block 和 Grand Central Dispatch 从根本上改善了应用程序的开发过程。相比于在应用中用 delegate 乱七八糟地实现逻辑,开发者们可以用 block 将相关的功能放在一起。GCD 能够轻易来回调度工作,不用面对乱七八糟的线程、调用和操作队列。
更重要的是,对于每个 request operation,可以通过 block 自定义 NSURLConnectionDelegate 的方法(比如,通过setWillSendRequestForAuthenticationChallengeBlock: 可以覆盖默认的connection:willSendRequestForAuthenticationChallenge: 方法)。
现在,我们可以创建 AFURLConnectionOperation 并把它安排进 NSOperationQueue,通过设置 NSOperation 的新属性completionBlock,指定操作完成时如何处理 response 和 response data(或是请求过程中遇到的错误)。
序列化 & 验证
更深入一些,request operation 操作也可以负责验证 HTTP 状态码和服务器响应的内容类型,比如,对于 application/jsonMIME 类型的响应,可以将 NSData 序列化为 JSON 对象。
从服务器加载 JSON、XML、property list 或者图像可以抽象并类比成潜在的文件加载操作,这样开发者可以将这个过程想象成一个 promise 而不是异步网络连接。
介绍 AFNetworking 2.0
AFNetworking 胜在易于使用和可扩展之间取得的平衡,但也并不是没有提升的空间。
在第二个大版本中,AFNetworking 旨在消除原有设计的怪异之处,同时为下一代 iOS 和 Mac OS X 应用程序增加一些强大的新架构。
动机
兼容 NSURLSession -
NSURLSession是 iOS 7 新引入的用于替代NSURLConnection的类。NSURLConnection并没有被弃用,今后一段时间应该也不会,但是NSURLSession是 Foundation 中网络的未来,并且是一个美好的未来,因为它改进了之前的很多缺点。(参考 WWDC 2013 Session 705 “What’s New in Foundation Networking”,一个很好的概述)。起初有人推测,NSURLSession的出现将使 AFNetworking 不再有用。但实际上,虽然它们有一些重叠,AFNetworking 还是可以提供更高层次的抽象。AFNetworking 2.0 不仅做到了这一点,还借助并扩展NSURLSession来铺平道路上的坑洼,并最大程度扩展了它的实用性。模块化 - 对于 AFNetworking 的主要批评之一是笨重。虽然它的构架使在类的层面上是模块化的,但它的包装并不允许选择独立的一些功能。随着时间的推移,
AFHTTPClient尤其变得不堪重负(其任务包括创建请求、序列化 query string 参数、确定响应解析行为、生成和管理 operation、监视网络可达性)。 在 AFNetworking 2.0 中,你可以挑选并通过 CocoaPods subspecs 选择你所需要的组件。实时性 - 在新版本中,AFNetworking 尝试将实时性功能提上日程。在接下来的 18 个月,实时性将从最棒的 1% 变成用户都期待的功能。 AFNetworking 2.0 采用 Rocket 技术,利用 Server-Sent Event 和 JSON Patch 等网络标准在现有的 REST 网络服务上构建语义上的实时服务。
演员阵容
NSURLConnection 组件 (iOS 6 & 7)
AFURLConnectionOperation-NSOperation的子类,负责管理NSURLConnection并且实现其 delegate 方法。AFHTTPRequestOperation-AFURLConnectionOperation的子类,用于生成 HTTP 请求,可以区别可接受的和不可接受的状态码及内容类型。2.0 版本中的最大区别是,你可以直接使用这个类,而不用继承它,原因可以在“序列化”一节中找到。AFHTTPRequestOperationManager- 包装常见 HTTP web 服务操作的类,通过AFHTTPRequestOperation由NSURLConnection支持。
NSURLSession 组件 (iOS 7)
AFURLSessionManager- 创建、管理基于NSURLSessionConfiguration对象的NSURLSession对象的类,也可以管理 session 的数据、下载/上传任务,实现 session 和其相关联的任务的 delegate 方法。因为NSURLSessionAPI 设计中奇怪的空缺,任何和NSURLSession相关的代码都可以用AFURLSessionManager改善。AFHTTPSessionManager-AFURLSessionManager的子类,包装常见的 HTTP web 服务操作,通过AFURLSessionManager由NSURLSession支持。
总的来说:为了支持新的
NSURLSessionAPI 以及旧的未弃用且还有用的NSURLConnection,AFNetworking 2.0 的核心组件分成了 request operation 和 session 任务。AFHTTPRequestOperationManager和AFHTTPSessionManager提供类似的功能,在需要的时候(比如在 iOS 6 和 7 之间转换),它们的接口可以相对容易的互换。之前所有绑定在
AFHTTPClient的功能,比如序列化、安全性、可达性,被拆分成几个独立的模块,可被基于NSURLSession和NSURLConnection的 API 使用。
序列化
AFNetworking 2.0 新构架的突破之一是使用序列化来创建请求、解析响应。可以通过序列化的灵活设计将更多业务逻辑转移到网络层,并更容易定制之前内置的默认行为。
<AFURLRequestSerializer>- 符合这个协议的对象用于处理请求,它将请求参数转换为 query string 或是 entity body 的形式,并设置必要的 header。那些不喜欢AFHTTPClient使用 query string 编码参数的家伙,你们一定喜欢这个。<AFURLResponseSerializer>- 符合这个协议的对象用于验证、序列化响应及相关数据,转换为有用的形式,比如 JSON 对象、图像、甚至基于 Mantle 的模型对象。相比没完没了地继承AFHTTPClient,现在AFHTTPRequestOperation有一个responseSerializer属性,用于设置合适的 handler。同样的,再也没有没用的受NSURLProtocol启发的 request operation 类注册,取而代之的还是很棒的responseSerializer属性。谢天谢地。
安全性
感谢 Dustin Barker、Oliver Letterer、Kevin Harwood 等人做出的贡献,AFNetworking 现在带有内置的 SSL pinning 支持,这对于处理敏感信息的应用是十分重要的。
AFSecurityPolicy- 评估服务器对安全连接针对指定的固定证书或公共密钥的信任。tl;dr 将你的服务器证书添加到 app bundle,以帮助防止 中间人攻击。
可达性
从 AFHTTPClient 解藕的另一个功能是网络可达性。现在你可以直接使用它,或者使用 AFHTTPRequestOperationManager /AFHTTPSessionManager 的属性。
AFNetworkReachabilityManager- 这个类监控当前网络的可达性,提供回调 block 和 notificaiton,在可达性变化时调用。
实时性
AFEventSource-EventSourceDOM API 的 Objective-C 实现。建立一个到某主机的持久 HTTP 连接,可以将事件传输到事件源并派发到听众。传输到事件源的消息的格式为 JSON Patch 文件,并被翻译成AFJSONPatchOperation对象的数组。可以将这些 patch operation 应用到之前从服务器获取的持久性数据集。NSURL *URL = [NSURL URLWithString:@"http://example.com"];
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:URL];
[manager GET:@"/resources" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
[resources addObjectsFromArray:responseObject[@"resources"]]; [manager SUBSCRIBE:@"/resources" usingBlock:^(NSArray *operations, NSError *error) {
for (AFJSONPatchOperation *operation in operations) {
switch (operation.type) {
case AFJSONAddOperationType:
[resources addObject:operation.value];
break;
default:
break;
}
}
} error:nil];
} failure:nil];
UIKit 扩展
之前 AFNetworking 中的所有 UIKit category 都被保留并增强,还增加了一些新的 category。
AFNetworkActivityIndicatorManager:在请求操作开始、停止加载时,自动开始、停止状态栏上的网络活动指示图标。UIImageView+AFNetworking:增加了imageResponseSerializer属性,可以轻松地让远程加载到 image view 上的图像自动调整大小或应用滤镜。比如,AFCoreImageSerializer可以在 response 的图像显示之前应用 Core Image filter。UIButton+AFNetworking(新):与UIImageView+AFNetworking类似,从远程资源加载image和backgroundImage。UIActivityIndicatorView+AFNetworking(新):根据指定的请求操作和会话任务的状态自动开始、停止UIActivityIndicatorView。UIProgressView+AFNetworking(新):自动跟踪某个请求或会话任务的上传/下载进度。UIWebView+AFNetworking(新): 为加载 URL 请求提供了更强大的API,支持进度回调和内容转换。
于是终于要结束 AFNetworking 旋风之旅了。为下一代应用设计的新功能,结合为已有功能设计的全新架构,有很多东西值得兴奋。
旗开得胜
将下列代码加入 Podfile 就可以开始把玩 AFNetworking 2.0 了:
platform :ios, '7.0'
pod "AFNetworking", "2.0.0"
For anyone coming over to AFNetworking from the current 1.x release, you may find the AFNetworking 2.0 Migration Guideespecially useful.
对于由 AFNetworking 1.x 版本转移到新版本的用户,你可以找到 AFNetworking 2.0 迁移指南。
如果你遇到 bug 或者其它的奇怪的地方,请通过在 GitHub 开启一个问题来帮助我们改进。非常感谢您的帮助。
对于一般的使用问题,请随时 tweet 我 @AFNetworking,或者给我发邮件 m@mattt.me。
哦耶,还有一件事……
AFNetworking2.0 NSHipster翻译的更多相关文章
- PyCharm3.0默认快捷键(翻译的)
PyCharm3.0默认快捷键(翻译的) PyCharm Default Keymap 1.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性)Ctrl + Alt ...
- AFNetworking2.0简易GET,POST请求封装以及使用
AFNetworking2.0简易GET,POST请求封装以及使用 AFNetworking不用我赘述其强大性,本人仅仅做了非常简易的封装,解决了有时候请求出错的问题,提供源码给大家. 封装源码库下载 ...
- AFNetworking2.0源代码解析
写在前面给大家推荐一个不错的站点 点击打开链接 本文測试样例源代码下载地址 近期看AFNetworking2的源代码.学习这个知名网络框架的实现.顺便梳理写下文章. AFNetworking的代码还在 ...
- 关于Gradle2.0的翻译说明
Gradle1.12的翻译情况 Gradle实际上在4月16日就已经在对应的OmegaT项目上完成了翻译,后因项目繁忙,直到7月20日才完成了Github上Gradledoc项目及七牛站点的更新. 总 ...
- AFNetworking2.0源码解析<一>
本篇先看看AFURLConnectionOperation,AFURLConnectionOperation继承自NSOperation,是一个封装好的任务单元,在这里构建了NSURLConnecti ...
- PBAP 1.0协议翻译(Part1)
添加vCard3.0 Spec的链接- http://tools.ietf.org/html/rfc2425- http://tools.ietf.org/html/rfc2426 寻找最新的Spec ...
- android 6.0特性翻译 --渣渣
所有关于Android 6.0 棉花糖的知识 上下文帮助 1.现在按压:不需要离开你正在运行的app或者访问的网站就可 获取帮助,仅仅触摸和按下Home按钮.(长按Home键,可以在 android ...
- VLD 1.0 ReadMe翻译尝试
近期想学习下VLD的实现,打算从最简单的V1.0版本看起.以下是V1.0版本自己尝试翻译下,最新的2.x版本似乎强大了很多. 简介 Visual C++提供了内置的内存检测机制,但其充其量只满足了最小 ...
- C# Language Specification 5.0 (翻译)第一章 引言
C#(念作 See Sharp)是一种简单.现代.面向对象并且类型安全的编程语言.C# 源于 C 语言家族,因此 C.C++ 和 Java 工程师们能迅速上手.ECMA 国际[1](ECMA Inte ...
随机推荐
- oracle简单两个操作
sqlplus sys/密码 as sysdba ALTER USER 账号 IDENTIFIED BY 新密码; select * from (select rownum 别名 ,表名.* fro ...
- python 元组问题解决
a = (1,2,{'k1':'b2'}) a[2]['k1'] = 5 print(a) (1, 2, {'k1': 5}) 为什么元素'b2' = 5 应该是元素'k1' = 5 求解 a[2][ ...
- Python核心编程2第四章课后练习
4-1 Python 对象.与所有 Python 对象有关的三个属性是什么?请简单的描述一下. 身份:对象的唯一标识 类型 :对象的类型决定了该对象可以保存什么类型的值 ...
- 我学C的那些年[ch02]:宏,结构体,typedef
c语言的编译过程: 预处理 编译 汇编 链接 而预处理中有三种情况: 文件包含( #include ) 条件编译(#if,#ifndef,#endif) 宏定义( #define ) 宏就是预处理中的 ...
- IOC(控制反转)与DI(依赖注入)的个人理解。
控制反转IOC(Inversion of Control)的三个需要理清问题: 1.谁控制了谁,控制了什么东西?IOC容器控制了依赖对象的创建. 2.谁得到了反转? 一般的应用程序是,直接创建依赖于该 ...
- tornado远远不止
大家的回答都有点片面,更多的关注web框架成,其实tornado远远不止这些,且听我慢慢到来1.高性能的网络库,这可以和gevent,twisted,libevent等做对.提供了异步io支持,超时事 ...
- PAT (Basic Level) 1013. 数素数 (20)
令Pi表示第i个素数.现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数. 输入格式: 输入在一行中给出M和N,其间以空格分隔. 输出格式: 输出从PM到PN的所有素数 ...
- the design of everyday things
Design principles: Conceptual models Feedback Constraints Affordances All are important. This is wha ...
- Codeforces Round #204 (Div. 2): B
很简单的一个题: 只需要将他们排一下序,然后判断一下就可以了! 代码: #include<cstdio> #include<algorithm> #define maxn 10 ...
- MyEclipse6.5安装SVN插件的三种方法z
一.安装方法: 方法一.如果可以上网可在线安装 . 打开Myeclipse,在菜单栏中选择Help→Software Updates→Find and Install; . 选择Search ...