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

posted @ 2016-03-19 19:15  xiayao.zeng  阅读(231)  评论(0编辑  收藏  举报