AFNetworking 3.0迁移指南要点整理(AFNetworking 3.0 Migration Guide)
1.基本概述:
3.0是 AFNetworking 的最新版,移除了对于 NSURLConnection 的 API 的支持,并建议升级到基于 NSURLSession 的 API. AFNetworking 2.x 将继续接受 bug 信息反馈和修复,但是不会再添加新的功能。苹果也在 iOS9 中废止了 NSURLConnection 的使用,所以还是逐渐迁移吧!
AFNetworking 3.0的系统要求为:iOS 7+, Mac OS X 10.9+, watchOS 2+, tvOS 9, and Xcode 7。
由于从 NSURLConnection 到 NSURLSession 的变化,里面的内容也发生了许多变化:
移除的类有:
-
AFURLConnectionOperation
AFHTTPRequestOperation
AFHTTPRequestOperationManage
修改的类有:
-
UIImageView+AFNetworking
UIWebView+AFNetworking.h
UIButton+AFNetworking.h
如果现在使用的是 AFHTTPRequestOperationManager,需要迁移到 AFHTTPSessionManager,但是以下的类可以重用:
-
securityPolicy
requestSerializer
responseSerializer
官方还提供了一个迁移的代码实例(如下)。3.x 版本无论成功失败都会传回一个 NSURLSessionTask,而不是 AFHTTPRequestOperation.
AFNetworking 2.x
1 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 2 [manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 3 NSLog(@"JSON: %@", responseObject); 4 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 5 NSLog(@"Error: %@", error); 6 }];
AFNetworking 3.x
1 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 2 [manager GET:@"http://example.com/resources.json" parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) { 3 NSLog(@"JSON: %@", responseObject); 4 } failure:^(NSURLSessionTask *operation, NSError *error) { 5 NSLog(@"Error: %@", error); 6 }];
与 NSURLConnection 对象不同,每个 NSURLConnection 对象共享应用范围的设置如会话管理、缓存策略、Cookie存储以及URL协议等,这些 NSURLSession 对象都可以单独进行配置。使用特定的配置来初始化会话,它可以发送任务来获取数据,并上传或下载文件。
在AFNetworking 2.0中,使用AFHTTPRequestOperation,有可能创建一个没有额外开销的独立的网络请求来获取数据。NSURLSession则需要更多的开销,为了获得所要请求的数据。
接下来,将要通过AFHTTPSessionManager创建一个单例,并创建一个任务和启动它。
AFNetworking 2.x
NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.json"]; 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.x
1 NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.json"]; 2 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 3 [manager GET:URL.absoluteString parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) { 4 NSLog(@"JSON: %@", responseObject); 5 } failure:^(NSURLSessionTask *operation, NSError *error) { 6 NSLog(@"Error: %@", error); 7 }];
注意:NSURLSession 不是建立在 NSOperation 基础上的。如果你的 app 高度依赖于 AFURLConnectionOperation 的 NSOperation 方面的功能,那就需要额外在 NSOperation 基础上,对于 AFHTTPSessionManager 进行再次的封装。
2.跟踪进度
AFNetworking 3.0 使用 NSProgress 来跟踪 NSURLSessionTasks 的进度,包括上传和下载进度:
-
uploadProgressForTask:
downloadProgressForTask:
通过 KVO,只要响应头包含了 Content-Length,就能够跟踪每个 task 的进度。
3.UIKit 迁移
图片下载已经重构,以遵循 AlamofireImage 架构与新的 AFImageDownloader 类。UIButton 与 UIImageView 也是用这个类作为图片下载的代理,并且提供了一些方法,在必要时可以自定义。该类别中,下载远程图片的实际方法没有改变。
UIWebView的category重构为使用共享的AFHTTPSessionManager来处理网络请求。
UIAlertView的类目因过时而被废弃。并没有提供UIAlertController类目的计划,因为这是应用程序应处理的逻辑,而不是这个库。