zoukankan      html  css  js  c++  java
  • AFNetworking新版本3.0的迁移

    版本迁移面试官经常问的:

    参考:http://www.jianshu.com/p/0ab3ffa9c5f5

    AFNetworking在3.0版本中删除了基于NSURLConnection API的所有支持。如果项目以前使用过这些API,那么我们需要升级到基于NSURLSession的API的AFNetworking 的版本。

    实现流程:

    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) {
            //失败
        }];

    1、当我们调用get函数之前,我们需要创建一个AFNTTPSessionManager,在之前我们使用的一般是AFHTTPRequestOperationManager.

    2、在调用get请求后,我们一般都不需要干什么了,因为那些繁琐复杂的网路通信都交给他去做了,他首先会调用AFNetworkReachabilityManager验证是否联网。

    3、然后参数序列化,用于网络请求。

    4、调用AFSecurityPolicy类,AFSecurityPolicy用于验证HTTPS请求的证书,简单来说建立连接 参考:http://blog.cnbang.net/tech/2416/

    5、连接建立完成,证书验证成功,开始请求服务器。

    6、从服务器返回数据,解析服务器数据,将数据反序列化。

    7、我们得到data类型的数据,可以使用JSON解析直接解析成字典使用。

    所做的改变:

    1、NSURLConnection的API已废弃

    AFNetworking 1.0建立在NSURLConnection的基础API上,AFNetworking2.0开始使用NSURLConnection基础的API,以及较新基于NSURLSession的API的选项。AFNetworking3.0现已完全基于NSURLSession的API,这降低了维护的负担。在xcode7中,NSURLConnection的API已经正式被苹果弃用。虽然该API将继续运行,但将没新功能被添加,并且苹果已经通知所有基于网络的功能,以充分使用NSURLSession向前发展。

    AFNetworking2.x将继续获得关键的隐患和安全补丁,但没有新的功能将被添加。

    弃用的类

    下面的类已从AFNetworking3.0中废弃:

    • AFURLConnectionOperation
    • AFHTTPRequestOperation
    • AFHTTPRequestOperationManager

    修改的类

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

    • UIImageView+AFNetworking
    • UIWebView+AFNetworking
    • UIButton+AFNetworking

    迁移

    AFHTTPRequestOperationManager核心代码

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

    • securityPolicy
    • requestSerializer
    • responseSerializer

    在上面说明流程的时候已经演示过最新版本的使用了,我们可以发现HTTP网络请求返回的不再是AFHTTPRequestOperation, 修改成为了NSURLSessionTask,并且成功和失败的Block块中的参数也变更为了NSURLSessionTask,而不再是AFHTTPRequestOperation。

    AFHTTPRequestOperation 核心代码
    与NSURLConnection对象不同,每个共享应用范围的设置如会话管理、缓存策略、Cookie存储以及URL协议等,这些NSURLSession对象都可以单独进行配置。使用特定的配置来初始化会话,它可以发送任务来获取数据,并上传或下载文件。
    在AFNetworking 2.0中,使用AFHTTPRequestOperation,有可能创建一个没有额外开销的独立的网络请求来获取数据。NSURLSession则需要更多的开销,为了获得所要请求的数据。
    接下来,将要通过AFHTTPSessionManager创建一个单例,并创建一个任务和启动它。

    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类目的计划,因为这是应用程序应处理的逻辑,而不是这个库。

    建议

    在这里我建议大家都封装一个自己的网络库,这样不至于当第三方库发生重大更新的时候导致我们手忙脚乱,有大量的代码需要修改,如果我们对AFNetworking进行二次封装,使用的自己的网络下载类,改的时候只需要在类中进行修改就万事大吉了,轻松简单,还可以将我们需要的一些东西封装进去,比如HUD加载动画等,当然,github上也有一些基于AFNetworking封装好的网络库,但毕竟不如自己写的适合自己的需要,对吧.

     
    文/_轻舟(简书作者)
    原文链接:http://www.jianshu.com/p/0ab3ffa9c5f5
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 相关阅读:
    网络安全之常见攻击
    引入element-ui
    引入sass
    浏览器解析流程
    JDK8 HashMap--removeNode()移除节点方法
    JDK8 HashMap--treeify()树形化方法
    JDK1.8 HashMap--treeifyBin()方法
    二叉查找树ADT
    队列ADT

  • 原文地址:https://www.cnblogs.com/mingmenqiaochu/p/5886234.html
Copyright © 2011-2022 走看看