AFNetworking 3.0迁移指南

作者: 暮落晨曦 | 来源:发表于2015-10-19 16:30 被阅读94712次

AFNetworking 3.0

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

本指南是为了引导使用AFNetworking 2.x升级到最新的版本API,以达到过渡的目的,并且解释了新增和更改的设计结构。

新设备要求: iOS 7, Mac OS X 10.9, watchOS 2, tvOS 9, & Xcode 7

AFNetworking 3.0正式支持的iOS 7, Mac OS X的10.9, watchOS 2 , tvOS 9 和Xcode 7。如果你想使用AFNetworking在针对较旧版本的SDK项目,请检查README的兼容性信息。

NSURLConnection的API已废弃

AFNetworking 1.0建立在NSURLConnection的基础API之上 ,AFNetworking 2.0开始使用NSURLConnection的基础API ,以及较新基于NSURLSession的API的选项。 AFNetworking 3.0现已完全基于NSURLSession的API,这降低了维护的负担,同时支持苹果增强关于NSURLSession提供的任何额外功能。由于Xcode 7中,NSURLConnection的API已经正式被苹果弃用。虽然该API将继续运行,但将没有新功能将被添加,并且苹果已经通知所有基于网络的功能,以充分使NSURLSession向前发展。

AFNetworking 2.X将继续获得关键的隐患和安全补丁,但没有新的功能将被添加。Alamofire(Swift下的网络请求)软件基金会建议,所有的项目迁移到基于NSURLSession的API。

弃用的类

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

  • AFURLConnectionOperation
  • AFHTTPRequestOperation
  • AFHTTPRequestOperationManager

修改的类

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

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

迁移


AFHTTPRequestOperationManager 核心代码

如果你以前使用 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则需要更多的开销,为了获得所要请求的数据。

接下来,将要通过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);
}];

UIKit的迁移

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

UIWebView的类目被重构为使用AFHTTPSessionManager作为其网络请求。

UIAlertView的类目被废弃

从AFNetworking 3.0后UIAlertView的类目因过时而被废弃。并没有提供UIAlertController类目的计划,因为这是应用程序应处理的逻辑,而不是这个库。

原文链接: AFNetworking 3.0
纯属个人翻译,如有错误,还请纠正。

相关文章

网友评论

  • ChardXu:请问一下如果我想用3.0版本创建请求队列应该怎么处理?
  • 8fe80d3b30e6:我用这个AF的时候,用别人分装的来实现的,但是导入分装类后报错
    Undefined symbols for architecture x86_64:
    "_OBJC_CLASS_$_AFHTTPSessionManager", referenced from:
    objc-class-ref in RequestNetWorking.o
    "_OBJC_CLASS_$_AFJSONRequestSerializer", referenced from:
    objc-class-ref in RequestNetWorking.o
    "_OBJC_CLASS_$_AFJSONResponseSerializer", referenced from:
    objc-class-ref in RequestNetWorking.o
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    大神知道这是什么问题吗?急。。。
  • 5df4ebbcb2a0:有你更精彩!!!
  • 00after:mark
  • 劉戦軍:很棒, 而且也很详细
    暮落晨曦:@ZJPhantom 谢谢
  • 简教练:我这看了看 发现 3.0的 GET和POST中的请求方法不对
    3.0的是 GET: parameters: progress: success: failure: 你上面写的 3.0的方法少了一个 progress参数
    不知道是我使用方法问题还是早期中的3.0就是这样的
    简教练:好的,谢谢啊
    暮落晨曦:@Goffredo 后期改的
  • 8c3fa9cdf022:可惜不给回复哎大神。
  • 雅之上善若水:好文 必须鼓励下
    暮落晨曦:@雅之上善若水 谢谢
  • 一个人的阳光:不错,已经升级完成,THS:smile:
  • 微笑的痕迹:3.0如果要取消某一个请求怎么做 以前AFHTTPRequestOperationManager应该是有cancle的方法
    微笑的痕迹:换了一种方式
    5f3040a1cc26:请问你解决这个取消某一个请求的问题了吗?
  • xwlyun:实测 afn 3.0 在 ios 7的设备上出现了兼容性问题
    相同的app端程序,请求同一个服务端,ios7测试fail
    https://github.com/AFNetworking/AFNetworking/issues/1398
    暮落晨曦:@xwlyun 这个我没测过, 我试试...
  • 7b77e6e820c6:AFNetworking 3.0不需要 NSURL *URL = [NSURL URLWithString:@""]; 在GET里面就直接有封装的
    7b77e6e820c6:@暮落晨曦 看到后面才知道有个原文地址,翻译棒棒的
    暮落晨曦:@大王派我来巡山嘞 这是系统官方文档的代码,我只是复制的。
  • 319188cff77a:厉害👍!
  • 042a0e1be73f:AFNetworking 3.0支持iOS8吗?
  • 我叫柱子哥:挺不错的,mark 一下
  • mark666:写的不错
  • c90210826a08: 昌哥V5 :heart_eyes:
  • 042a0e1be73f:以前AFHTTPRequestOperation创建的请求队列,现在怎么创建啊?
    5f3040a1cc26:请问你知道怎么用AFNetworking3.0创建多任务请求吗?急求!!!
  • 来扶爷试玩个波:接下来,将要通过AFHTTPSessionManager创建一个单例,并创建一个任务和启动它。

    [AFHTTPSessionManager manage] 创建的明显不是一个单例。
    507c8564b280:@暮落晨曦 对的,不然会有内存泄漏的问题,Leaks,前几天找到这个问题。
    暮落晨曦:@来扶爷试玩个波 好的,写的时候没注意到...alloc init的,我作对应修改....谢谢
  • 5cfaa4a760b2:写的不错,不过我想问下3.0中多任务队列怎么操作呢
  • Funnyer:AFNetworking3.0的时候,AFNetworking和UIKit+AFNetworking都要导入吗 第二个什么作用?我看只是倒入AFNetworking3.0就可以了,也不报错。第二个什么作用呢?
    Funnyer:@66e02a10bcec 好的 多谢
    Jack_Liao:@FunnyFzl UIKit框架是用来写UI的啊,UIImage UIImageView这些视图请求网络图片的时候会用到第二个。
  • iOS程序犭袁:好文
    Funnyer:@iOS程序犭袁 AFNetworking3.0的时候,AFNetworking和UIKit+AFNetworking都要导入吗 第二个什么作用?我看只是倒入AFNetworking3.0就可以了,也不报错。第二个什么作用呢?
    暮落晨曦:@iOS程序犭袁 谢大神评价
  • AE86:32个赞
  • 2dd6a71e901d:明天去看看
  • restkuan:昨天微博推荐你文章的~,欢迎关注【Swift-CN】 :smiley: ~~
    目前转发 27 评论 8 点赞 6
  • 薛凯凯圆滚滚:哇塞,什么时候出的啊!Github上还是2.0的呀没见有更新
    暮落晨曦:@e9a6d649ac3c github下载最新的
    e9a6d649ac3c:@薛凯凯圆滚滚 2.0用不了了,我在网上也找不到3.0,你们现在是怎么处理的啊?新手求指导
  • 煜寒了:好神速,昨天才知道,很赞
    暮落晨曦:@煜寒了 谢谢
  • JanzTam:赞!翻译得不错!期待更多好文!
    暮落晨曦:@JanzTam 好的👌🏻

本文标题:AFNetworking 3.0迁移指南

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