之前安装AFNetWorking 3.0出了一些小状况,临近回家事都比较多,英文文档在此AFNetworking-3.0-Migration-Guide。有人已经翻译过这篇文章,本文尝试自己翻译一次,如果不当,希望多多指正.
AFNetWorking 3.0是AFNetWorking最新的主要发布版,iOS和Mac OS X中令人感到兴奋的网络库。为了保持版本向前发展的可维护性,3.0中删除了所有基于被废弃的
NSURLConnection
的API。如果你的项目使用到了基于NSURLConnection
的API,建议你使用基于NSURLSession
的API。本文会介绍具体迁移的方法过程,基于AFNetWorking 2.X到3.0之间的过渡,我们将带你领略3.0新的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, and Xcode 7。如果你想使用AFNetworking在一个较旧的SDK项目中,请通过README 检查一下兼容信息。
NSURLConnection APIs 已经移除
AFNetworking 1.0通过NSURLConnection基础的APIs, AFNetworking 2.0 提供了选择基于NSURLConnection的基础APIs, 或者使用较新的基于NSURLSession的基础APIs。AFNetworking 3.0 现在只提供基于NSURLSession的基础APIs,降低版本向前发展维护的负担,同时会支持NSURLSession
未来添加的额外功能.
Xcode 7中NSURLConnection
API已经被正式弃用。当你使用这些API来实现网络调用时会建议你使用新的NSURLSession
。
AFNetworking 2.x将继续对关键bug和安全问题的修改,但是不会添加新的功能。Alamofire基金会建议所有的项目都迁移到基于NSURLSession
的基础APIs之上。
删除的类
关于以下的类已经被删除:
AFURLConnectionOperation
AFHTTPRequestOperation
AFHTTPRequestOperationManager
改进的类
有一些类中的关键实现是通过NSURLConnection
实现的,他们内部已经使用NSURLSession
进行了重构.
UIImageView+AFNetworking
UIWebView+AFNetworking.h
UIButton+AFNetworking.h
迁移
AFHTTPRequestOperationManager基础代码
如果你之前使用AFHTTPRequestOperationManager
,你需要使用AFHTTPSessionManager
,两者之间复用了一部分API,主要包括:
securityPolicy
requestSerializer
responseSerializer
下面是一个迁移中使用AFHTTPSessionManager
的简单例子,需要注意的是HTTP动词方法返回的是NSURLSessionTask而不是AFHTTPRequestOperation。成功回调的blocks中传递的是NSURLSessionTask而不是AFHTTPRequestOperation.
AFNetworking 2.x
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@http://www.jianshu.com/users/24da48b2ddb3/latest_articles" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"FlyElephant: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"FlyElephant: %@", error);
}];
AFNetworking 3.x
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:@"http://www.jianshu.com/users/24da48b2ddb3/latest_articles" parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {
NSLog(@"FlyElephant: %@", responseObject);
} failure:^(NSURLSessionTask *operation, NSError *error) {
NSLog(@"FlyElephant: %@", error);
}];
AFHTTPRequestOperation基础代码
不像NSURLConnection
对象,每个共享应用的范围设置为会话管理,缓存策略,cookie存储和URL协议,NSURLSession
对象可以单独配置所有选项。一旦会话通过特殊的配置初始化,它能分发任务获取数据,上传或下载文件.
通过AFNetworking 2.0使用AFHTTPRequestOperation,有可能创造一个单独的没有额外开销的的请求获取远程数据。NSURLSession
需要更多的开销,为了获得请求的数据.
现在,我们通过AFHTTPSessionManager
创建对象,接下来创建任务来启动它.
AFNetworking 2.x
NSURL *URL = [NSURL URLWithString:@"http://www.jianshu.com/users/24da48b2ddb3/latest_articles"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
op.responseSerializer = [AFJSONResponseSerializer serializer];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"FlyElephant: %@", responseObject);
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"FlyElephant: %@", error);
}];
[[NSOperationQueue mainQueue] addOperation:op];
AFNetworking 3.x
NSURL *URL = [NSURL URLWithString:@"http://www.jianshu.com/users/24da48b2ddb3/latest_articles"];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:URL.absoluteString parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {
NSLog(@"FlyElephant-JSON: %@", responseObject);
} failure:^(NSURLSessionTask *operation, NSError *error) {
NSLog(@"FlyElephant-Error: %@", error);
}];
需要注意的是NSURLSession
并不是建立在NSOperation之上,如果你的应用程序很大程度上依赖AFURLConnectionOperation
的NSOperation
,会有额外的重构工作通过NSOperation基础方法来包装AFHTTPSessionManager
.
进度跟踪
AFNetworking 3.0使用NSProgress来跟踪NSURLSessionTasks的进度。除了上传和下载任务中的AFURLSessionManager的便利方法和AFHTTPSessionManager的GET和POST方法,AFURLSessionManager对外提供了每个任务的进度的方法:
- uploadProgressForTask:
- downloadProgressForTask:
通过KVO,Using KVO, 可以跟踪每个任务的进度,展示响应头的内容长度.通过#3187查看AFNetWorking 3.0进度的额外变化.
UIKit迁移
图片下载AFImageDownloader类遵循了 AlamofireImage架构. UIButton和 UIImageView分类作为AFImageDownloader的代理,暴露了下载的引用如果用户有需要可自定义下载行为。真正的远程下载图片方法接口保持不变。 UIWebView通过共享的AFHTTPSessionManager
重构了网络请求.
UIAlertView分类被移除
UIAlertView的分类在AFNetworking 3已经被废弃.目前没有计划去只是UIAlertController,这些逻辑应该是应用程序自己处理,并不是AFNetWorking库的责任来实现。
关于Example
例子中的项目支持所有可用的平台,包括 watchOS, tvOS和iOS扩展.
帮助
如果你有额外的问题关于迁移,通过GitHub提出问题获取更多关于迁移方面的清晰回答。
话外话
文中根据自己的理解进行了调整翻译,大体保持不变,难免有理解不当的地方,希望大家多多指正~by FlyElephant