zoukankan      html  css  js  c++  java
  • 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) {
            //失败
        }];

    流程图
    1. 当我们调用get函数之前,我们需要创建一个AFHTTPSessionManager,在之前我们使用的一般是AFHTTPRequestOperationManager.
    2. 在调用get请求后,我们一般都不需要干什么了,因为那些繁琐复杂的网络通信都交给他去做了,他首先会调用AFNetworkReachabilityManager验证是否联网.
    3. 然后参数序列化,用于网络请求.
    4. 调用AFSecurityPolicy类,AFSecurityPolicy用于验证HTTPS请求的证书,简单来说建立连接.具体建立步骤参照博客.
    5. 连接建立完成,证书验证成功,开始请求服务器.
    6. 从服务器返回数据,解析服务器数据,将数据反序列化.
    7. 我们得到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说明文档而写,其中加上了一些个人的理解和说明,有些理解可能会有偏差,请参照官方说明.

  • 相关阅读:
    leetcode教程系列——Binary Tree
    《Ranked List Loss for Deep Metric Learning》CVPR 2019
    《Domain Agnostic Learning with Disentangled Representations》ICML 2019
    Pytorch从0开始实现YOLO V3指南 part5——设计输入和输出的流程
    Pytorch从0开始实现YOLO V3指南 part4——置信度阈值和非极大值抑制
    Pytorch从0开始实现YOLO V3指南 part3——实现网络前向传播
    Pytorch从0开始实现YOLO V3指南 part2——搭建网络结构层
    Pytorch从0开始实现YOLO V3指南 part1——理解YOLO的工作
    让我佩服的人生 文章
    win8.1配置cordova+ionic等一系列东西
  • 原文地址:https://www.cnblogs.com/fengmin/p/5507692.html
Copyright © 2011-2022 走看看