iOS-AFN3.0与2.0区别

作者: 路飞_Luck | 来源:发表于2019-03-24 23:18 被阅读386次
    序言

    AFNetworking是一款在OS X和iOS下都令人喜爱的网络库。为了迎合iOS新版本的升级, AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持。如果你的项目以前使用过这些API,建议您立即升级到基于 NSURLSession 的API的AFNetworking的版本。

    一 发展历程
    • AFNetworking 1.0建立在NSURLConnection的基础API之上
    • AFNetworking 2.0开始使用NSURLConnection的基础API ,以及较新基于NSURLSession的API的选项。
    • AFNetworking 3.0现已完全基于NSURLSession的API,这降低了维护的负担,同时支持苹果增强关于NSURLSession提供的任何额外功能。
    • AFNetworking 2.X将继续获得关键的隐患和安全补丁,但没有新的功能将被添加。Alamofire(Swift下的网络请求)软件基金会建议,所有的项目迁移到基于NSURLSession的API。
    二 废弃与新增

    下面的类已从AFNetworking 3.0中废弃:

    • AFURLConnectionOperation
    • AFHTTPRequestOperation
    • AFHTTPRequestOperationManager

    依次被下面三个类代替了,同时请求方法也跟着改变了

    • AFURLSessionManager
    • AFHTTPSessionManager
    • AFNetworkReachabilityManager

    下面的类包含基于NSURLConnection的API的内部实现。他们已经被NSURLSession重构:

    • UIImageView+AFNetworking
    • UIWebView+AFNetworking
    • UIButton+AFNetworking
    三 迁移
    3.1 AFHTTPRequestOperationManager与AFHTTPSessionManager

    如果你以前使用 AFHTTPRequestOperationManager , 你将需要迁移去使用 AFHTTPSessionManager。 以下的类在两者过渡间并没有变化:

    • securityPolicy
    • requestSerializer
    • responseSerializer

    接下来举一个关于AFHTTPSessionManager的简单例子。注意HTTP网络请求返回的不再是AFHTTPRequestOperation, 修改成为了NSURLSessionTask,并且成功和失败的Block块中的参数也变更为了NSURLSessionTask,而不再是AFHTTPRequestOperation。

    AFNetworking 2.x
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:@"请求的url"parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"成功");
    } failure:^(AFHTTPRequestOperation *operation, NSError*error) {
        NSLog(@"失败");
    }];
    
    AFNetworking 3.0
    AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
    [session GET:@"请求的url"parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"成功");
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"失败");
    }];
    
    AFHTTPRequestOperation 核心代码

    与NSURLConnection对象不同,每个共享应用范围的设置如会话管理、缓存策略、Cookie存储以及URL协议等,这些NSURLSession对象都可以单独进行配置。使用特定的配置来初始化会话,它可以发送任务来获取数据,并上传或下载文件。

    在AFNetworking 2.0中,使用AFHTTPRequestOperation,有可能创建一个没有额外开销的独立的网络请求来获取数据。NSURLSession则需要更多的开销,为了获得所要请求的数据。

    3.2 创建单例

    接下来,将要通过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);
    }];
    
    3.3 获取请求头

    1. AFN2.0
    AFN2.0版本使用AFHTTPRequestOperation,获取的response为NSHTTPURLResponse,可以直接取allHeaderFields

    2. AFN3.0
    AFN3.0版本中使用的为NSURLSessionDataTask,获取的response为NSURLResponse,实际类型为NSHTTPURLResponse,需要进行类型转换为NSHTTPURLResponse,才能获取allHeaderFields。

    四 UIKit的迁移

    图片下载已经被重构,以遵循AlamofireImage架构与新的AFImageDownloader类。这个类的图片下载职责的代理人是UIButton与UIImageView的类目,并且提供了一些方法,在必要时可以自定义。类别中,下载远程图片的实际方法没有改变。

    • UIWebView的类目被重构为使用AFHTTPSessionManager作为其网络请求。
    • UIAlertView的类目被废弃
    五 AFNetworking3.0为何弃用了NSURLConnection
    5.1NSURLSession提升了网络连接速度

    2015年,RFC文档(RFC文档是一系列关于Internet的技术资料汇编,早期为ARPANET)编号7540正式发表了下一代HTTP协议HTTP/2,是1999年发布HTTP/1.1以来的首个更新。相对于前一个版本,HTTP/2以快著称。加载同样一张图片,新的协议所用时间是旧协议的四分之一。

    根据2015的WWDC Session711,我们知道iOS9+,NSURLSession开始正式支持HTTP/2,也就意味着你的网络连接速度可以提升不少。更人性化更优秀的API设计,HTTP/2的支持,成为了开发者摒弃NSURLConnection的理由。

    5.2 Session采用了共享,而非每次都新建

    共享Session到底给网络连接带来了哪些好处呢?我们先来聊聊网络通讯协议。我们都知道,HTTP协议是基于TCP协议的。所以在每次的HTTP请求之前,客户端和服务器都先需要经过TCP连接的三次握手,即请求之前,网络的数据都已经在客户端和服务器端之间来回了三次

    WechatIMG11.png

    事实上在HTTP/0.9 ,HTTP/1.0协议的时代,每次HTTP的请求,都需要先经过TCP的连接,而后才能开始HTTP的请求。那么,为了让我们的请求更快,避免每次都产生一个TCP三次握手,成了一个优化的选项。于是在HTTP/1.1中共享的Session将会复用TCP的连接,这样就避免了每次操作都开启一个TCP三次握手的时间浪费,即加速了网络请求时间。

    通过查看文档,我们可以知道iOS对同一个IP的服务器的最大并发数为4,OSX为6,但是如果没有共享Session,则可能会超过这个数。


    本文参考
    iOS AFN 3.0版本前后区别 02
    AFNetworking3.0为何弃用了NSURLConnection
    非常感谢该作者

    相关文章

      网友评论

        本文标题:iOS-AFN3.0与2.0区别

        本文链接:https://www.haomeiwen.com/subject/cuopvqtx.html