AFNetworking 新版本3.0的迁移
AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持。如果项目以前使用过这些API,那么我们需要升级到基于 NSURLSession 的API的AFNetworking的版本。
首先我们先不用管新版本到底改动了什么,我们先大概的了解一番AFNetworking到底为我们做了哪些事情,能够让我们能够省去大量的气力来处理网络下载这一块的东西.
这里我们只需要简单了解一下,因为这个库很庞大,用到了很多底层的知识,如果对实现原理感兴趣的,可以看一下bang's blog.
get请求的实现流程
//使用代码
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager GET:url parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
//成功
NSDictionary *obj = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
} failure:^(NSURLSessionDataTask *task, NSError *error) {
//失败
}];
- 当我们调用get函数之前,我们需要创建一个AFHTTPSessionManager,在之前我们使用的一般是AFHTTPRequestOperationManager.
- 在调用get请求后,我们一般都不需要干什么了,因为那些繁琐复杂的网络通信都交给他去做了,他首先会调用AFNetworkReachabilityManager验证是否联网.
- 然后参数序列化,用于网络请求.
- 调用AFSecurityPolicy类,AFSecurityPolicy用于验证HTTPS请求的证书,简单来说建立连接.具体建立步骤参照博客.
- 连接建立完成,证书验证成功,开始请求服务器.
- 从服务器返回数据,解析服务器数据,将数据反序列化.
- 我们得到data类型的数据,可以使用JSON解析直接解析成字典使用.
在这实现过程中他还帮我们做了开线程,异步下载,检查数据是否合法,图片解压等一些繁琐的事情,所以我们才能用得这么舒心,但是我们还是有必要研究一下内部的实现,只有保持着一颗求知的心,我们才能研究的更深,得到的更多.
上面我们已经大概清楚了实现过程,那么现在我们来看看到底新版本AFNetworking做了哪些改变
1. NSURLConnection的API已废弃
AFNetworking 1.0建立在NSURLConnection的基础API之上 ,AFNetworking 2.0开始使用NSURLConnection的基础API ,以及较新基于NSURLSession的API的选项。 AFNetworking 3.0现已完全基于NSURLSession的API,这降低了维护的负担。在Xcode 7中,NSURLConnection的API已经正式被苹果弃用。虽然该API将继续运行,但将没有新功能将被添加,并且苹果已经通知所有基于网络的功能,以充分使NSURLSession向前发展。
AFNetworking 2.X将继续获得关键的隐患和安全补丁,但没有新的功能将被添加。
弃用的类
下面的类已从AFNetworking 3.0中废弃:
- AFURLConnectionOperation
- AFHTTPRequestOperation
- AFHTTPRequestOperationManager
2. 修改的类
下面的类包含基于NSURLConnection的API的内部实现。他们已经被使用NSURLSession重构:
- UIImageView+AFNetworking
- UIWebView+AFNetworking
- UIButton+AFNetworking
3. 迁移
AFHTTPRequestOperationManager 核心代码
如果你以前使用 AFHTTPRequestOperationManager , 你将需要迁移去使用 AFHTTPSessionManager。 以下的类在两者过渡间并没有变化:
- securityPolicy
- requestSerializer
- responseSerializer
在上面说明流程的时候已经演示过最新版本的使用了,我们可以发现HTTP网络请求返回的不再是AFHTTPRequestOperation, 修改成为了NSURLSessionTask,并且成功和失败的Block块中的参数也变更为了NSURLSessionTask,而不再是AFHTTPRequestOperation。
AFHTTPRequestOperation 核心代码
与NSURLConnection对象不同,每个共享应用范围的设置如会话管理、缓存策略、Cookie存储以及URL协议等,这些NSURLSession对象都可以单独进行配置。使用特定的配置来初始化会话,它可以发送任务来获取数据,并上传或下载文件。
在AFNetworking 2.0中,使用AFHTTPRequestOperation,有可能创建一个没有额外开销的独立的网络请求来获取数据。NSURLSession则需要更多的开销,为了获得所要请求的数据。
接下来,将要通过AFHTTPSessionManager创建一个单例,并创建一个任务和启动它。
AFNetworking 2.x
NSURL *URL = [NSURL URLWithString:@""];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
op.responseSerializer = [AFJSONResponseSerializer serializer];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
[[NSOperationQueue mainQueue] addOperation:op];
AFNetworking 3.0
NSURL *URL = [NSURL URLWithString:@""];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:URL.absoluteString parameters:nil success:^(NSURLSessionTask *task, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(NSURLSessionTask *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
需要注意的是NSURLSession不是依赖于NSOperation而构建的。如果你有一个应用程序,它在很大程度上依赖于AFURLConnectionOperation的NSOperation的话,有可能需要为你的App的AFHTTPSessionManager用的NSOperation基础的方法进行重新的构造。
UIKit的迁移
图片下载已经被重构,以遵循AlamofireImage架构与新的AFImageDownloader类。这个类的图片下载职责的代理人是UIButton与UIImageView的类目,并且提供了一些方法,在必要时可以自定义。类别中,下载远程图片的实际方法没有改变。
UIWebView的类目被重构为使用AFHTTPSessionManager作为其网络请求。
UIAlertView的类目被废弃
从AFNetworking 3.0后UIAlertView的类目因过时而被废弃。并没有提供UIAlertController类目的计划,因为这是应用程序应处理的逻辑,而不是这个库。
说了那么多,其实真正用起来很简单,这里主要说的是他的改进方面,我们使用者其实用起来没那么麻烦,只是注意现在使用的是基于NSURLSession的API就可以了.
建议
在这里我建议大家都封装一个自己的网络库,这样不至于当第三方库发生重大更新的时候导致我们手忙脚乱,有大量的代码需要修改,如果我们对AFNetworking进行二次封装,使用的自己的网络下载类,改的时候只需要在类中进行修改就万事大吉了,轻松简单,还可以将我们需要的一些东西封装进去,比如HUD加载动画等,当然,github上也有一些基于AFNetworking封装好的网络库,但毕竟不如自己写的适合自己的需要,对吧.
本文一部分是参照AFNetworking说明文档而写,其中加上了一些个人的理解和说明,有些理解可能会有偏差,请参照官方说明.
AFNetworking 新版本3.0的迁移的更多相关文章
- [.net 面向对象程序设计深入](4)MVC 6 —— 谈谈MVC的版本变迁及新版本6.0发展方向
[.net 面向对象程序设计深入](4)MVC 6 ——谈谈MVC的版本变迁及新版本6.0发展方向 1.关于MVC 在本篇中不再详细介绍MVC的基础概念,这些东西百度要比我写的全面多了,MVC从1.0 ...
- AFNetworking 2.5.0版本的使用
http://www.mamicode.com/info-detail-477899.html AFNetworking 2.5.0版本的使用 http://afnetworking.com/ htt ...
- 安装CocoaPods报错 - [!] The dependency `AFNetworking (~> 3.1.0)` is not used in any concrete target.
今天新机装cocopods时,等安装完毕发觉出现[!] The dependency `AFNetworking (~> 3.1.0)` is not used in any concrete ...
- 第三方库AFNetworking 3.1.0的简单使用
AFNetworking是一个 在iOS开发中 使用非常多网络开源库.它是一个轻量级的网络请求API类库. 适用于iOS以及Mac OS X.它构建于在(Apple iOS开发文档) NSURLCon ...
- Entity Framework Core 2.0 数据库迁移
看见过几篇其他大神写的关于EFCore2.0的文章.本人有点小白,一开始看文档的时候除了一些基本操作外其他部分几乎没有读懂,我估计会有一部分人跟我一样,因为人家读懂了的早就懂了. 在这里我写一下我自己 ...
- 195. Spring Boot 2.0数据库迁移:Flyway
[视频&交流平台] àSpringBoot视频:http://t.cn/R3QepWG à SpringCloud视频:http://t.cn/R3QeRZc à Spring Boot源码: ...
- 从 Microsoft Dynamics CRM 4.0 server迁移到 Microsoft Dynamics CRM 2013 Server
不能就地升级早于 Microsoft Dynamics CRM Server 2011 的版本号,比方 Microsoft Dynamics CRM 4.0 server.可是,能够在升级过程中使用 ...
- iOS AFNetworking 2.6.0框架导入报错解决方法
最近手动导入AFNetworking 2.6.0框架时发现Xcode报如下3个错误: 1. Use of undeclared identifier ‘kSecFormatUnknown‘ 2. Us ...
- iOS 9 平台上 AFNetworking 框架 3.0 版本号解决的问题和问题解决
iOS 9 平台上 AFNetworking 框架 3.0 版本号解决的问题和问题解决 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名- ...
随机推荐
- socket.io
http://www.cnblogs.com/fullhouse/archive/2011/07/18/2109936.html http://www.cnblogs.com/fullhouse/ar ...
- ThreadLocal学习
1.简介: 类ThreadLocal<T>,为变量提供了线程本地化副本.对于用ThreadLocal维护的变量,当前线程中的副本不同于它在其他线程中的副本,每个线程通过ThreadLoca ...
- OA学习笔记-003-Hibernate3.6配置
一.jar包:核心包, 必须包, jpa, c3p0, jdbc antlr-2.7.6.jarc3p0-0.9.1.jarcommons-collections-3.1.jardom4j-1.6.1 ...
- ANDROID_MARS学习笔记_S04_006_用获取access_token,access_token_secrect
一.代码流程 1.MainActivity会开启PrepareRequestTokenActivity 2.PrepareRequestTokenActivity会根据配置文件的CONSUMER_KE ...
- PHP的MVC框架 深入解析
本篇先介绍一下php的MVC实现原理,我们框架的MVC部分也是基于此原理实现的,但是今天的代码并不是框架内的代码,仅仅为说明原理 一.文件结构 建立3个文件夹 controller文件夹存放控 ...
- Android Training精要(四) Intent注意事项
判断有处理Intent的Activity PackageManager packageManager = getPackageManager(); List<ResolveInfo> ac ...
- [OJ] Lowest Common Ancestor
LintCode 88. Lowest Common Ancestor (Medium) LeetCode 236. Lowest Common Ancestor of a Binary Tree ( ...
- pcDuino安装vnc进行远程控制
准备工作: 已经刷好的 pcduino : 点此购买 可选用显示器或者用ssh连接,ssh连接参考 无显示器刷机与使用 1.安装x11vnc 输入下面的命令: sudo apt-get insta ...
- Linux之sed详解
转载:http://blog.chinaunix.net/u/22677/showart_1076318.html 1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保 ...
- AKKA初体验
关于thread和actor下面这段话讲的很好Experienced developers have learned to be very careful with unrestricted thre ...