您的位置:首页 > 其它

AFNetwork 3.0 源码解读  (一) 新版本的变化

2015-12-25 16:17 351 查看
最近公司没什么啥事情,想读一读AFNetwork的源码,虽然网上有很多的解读.但终归自己读一遍还是有好处的.So let’s do it。
AFNetwork 3.0目前最新的版本是3.0.4.所以本次的对AFNetwork的了解就是基于此.各位开发者在进行3.0迁移时要注意.作者说明了3.0版本最低支持版本是从iOS7 .

从3.0的时代开始.AFNetwork已经废弃对NSURLConnection的支持也就是说3.0开始一下的类已经删除

AFURLConnectionOperation

AFHTTPRequestOperation

AFHTTPRequestOperationManager


用以替代的是下面的类:

AFURLSessionManager

AFHTTPSessionManager


有一些的类是可以在新旧版本复用:

securityPolicy

requestSerializer

responseSerializer


同时一下的类进行了修改(因为其中涉及到
NSURLConnection
Api.所以进行了修改替换成NSURLSession.)

UIImageView+AFNetworking

UIWebView+AFNetworking.h

UIButton+AFNetworking.h


作者在文档中说明如果你之前的开发是基于AFHTTPRequestOperationManager的网络请求现在你应该转到AFHTTPSessionManager下去进行.下面是新旧两个的对比

AFNetworking 2.x

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

[manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

NSLog(@"JSON: %@", responseObject);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];


AFNetworking 3.x

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager GET:@"http://example.com/resources.json" parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {

NSLog(@"JSON: %@", responseObject);

} failure:^(NSURLSessionTask *operation, NSError *error) {

NSLog(@"Error: %@", error);
}];

相对于2.0的版本.3.0进行请求完成后都会返回一个NSURLSessionTask,同时在block中的AFHTTPRequestOperation也替换成NSURLSessionTask


AFHTTPRequestOperation Based Code

相对与之前2.0中的NSURLConnection,NSURLConnection
共享了整个应用的会话管理(session management),
缓冲策略(cache policies,)
cookie存储(cookie storage,)
和URL 协议(URL
protocols).从3.0开始个NSURLSession对象都可以对上述属性进行独立的设置configuration,一旦一个session设置了制定的configuration就可以进行数据的请求、文件的上传/下载的操作。

在2.0版本的进行一个网络的数据请求时,你创建一个request可能不需要额外的花费就能取得远程数据。而在3.0

时。你可能为了完整的功能而付出一定的代价。


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

NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.json"];

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager GET:URL.absoluteString parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {

NSLog(@"JSON: %@", responseObject);

} failure:^(NSURLSessionTask *operation, NSError *error) {

NSLog(@"Error: %@", error);
}];

相比与2.0时。3.0进行网络请求时需要创建一个AFHTTPSessionManager *manager来进行网络的请求(感觉上没区,平时进行网络请求时也是使用AFHTTPOperationManager的)

注意:NSURLSession不在是基于NSOperation,所以如果你之前的代码对NSOperation
有着很重的依赖。那么你在进行3.0的迁移时可能会有许多的额外工作

还有值得注意的一点是:

任务追踪
在以前的网络请求中AFN并不能很好的对上传/下载任务进行一个很好的监听。但是从3.0开始AFNetworking使用
NSProgress
来对NSURLSessionTasks进行跟踪。除了在上传/下载的任务中加入了对block的支持,AFURLSessionManager还在.h中暴露了两个获得进度的方法:

uploadProgressForTask:

downloadProgressForTask:


在保证数据响应头中包含Content-Length,使用KVO,progress能够追踪到每个任务的进度。

Additional:
UIAlertView扩展也应经从3.0开始被移除了。而且作者也没打算过对UIAlertController进行一个支持

本文是参照AFNetworking说明文档而写,其中加上了一些个人的理解和简化,有些理解可能会有偏差,请参照官方说明.

PS:本文当中如有问题可以留言指正。thank you
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: