本文共 3617 字,大约阅读时间需要 12 分钟。
在AFNetworking升级到3.0之前,对于网络的请求是基于NSURLConnection,到3.0之后,已完全基于NSURLSession的API,这降低了维护的负担,同时支持苹果增强关于NSURLSession提供的任何额外功能。
下面的类已从AFNetworking 3.0中废弃:
AFURLConnectionOperation
AFHTTPRequestOperation AFHTTPRequestOperationManager 修改的类下面的类包含基于NSURLConnection的API的内部实现。他们已经被使用NSURLSession重构:
UIImageView+AFNetworking
UIWebView+AFNetworking UIButton+AFNetworkingAFHTTPRequestOperationManager2.x与3.0的比较
2.x
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];[manager GET:@"请求的url" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"成功");} failure:^(AFHTTPRequestOperation *operation, NSError*error) { NSLog(@"失败");}];
3.0
AFHTTPSessionManager *session = [AFHTTPSessionManager manager];[session GET:@"请求的url" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"成功");} failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"失败"); }];
AFHTTPRequestOperation 2.x与3.0区别
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];
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);}];
由代码可看出NSURLSession对象对每个共享应用范围的设置如会话管理、缓存策略、Cookie存储以及URL协议等都可以单独进行配置。使用特定的配置来初始化会话,它可以发送任务来获取数据,并上传或下载文件。
还要注意一点的是成功和失败的Block块中的参数也变更为了NSURLSessionTask。
上面3.0的例子是我们常用的AFHTTPSessionManager,但是我们还可以直接采用NSURLSession来请求网络。
NSURLSession *session = [NSURLSession sessionWithConfiguration: [NSURLSessionConfiguration defaultSessionConfiguration] delegate:nil delegateQueue:[NSOperationQueue mainQueue]]; NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:completionHandler]; [dataTask resume];
所以可以看到在AFNetworking3.0网络请求NSURLSession已经完全代替了NSURLConnection。
为什么要选择NSURLSession并复用Session
之前说过HTTP协议的工作原理,自从HTTP升级到1.1之后,该协议从原来的无状态变成了有状态。之前的HTTP只用于一次请求,数据传输完成之后就断开连接,不记忆任何信息,而升级后的HTTP可以复用同一个TCP/IP,用于多次请求,大大提高了网络传输的效率,减少了很多不必要的开销。
而AFNetworking3.0采用NSURLSession并且采用复用Session是异曲同工的做法,共享的Session将会复用TCP的连接,而每次都新建Session的操作将导致每次的网络请求都开启一个TCP的三次握手。
试想如果不采用复用,每次有请求都要建立新的连接,与采用复用比较,后者明显大大减少了网络的TCP/IP请求,加速了数据传输的效率。
苹果的文档中,还对一个服务器最高的TCP并发有相应的描述:
HTTPMaximumConnectionsPerHost Property The maximum number of simultaneous connections to make to a given host.Declaration
SWIFT var HTTPMaximumConnectionsPerHost: Int OBJECTIVE-C @property NSInteger HTTPMaximumConnectionsPerHost Discussion This property determines the maximum number of simultaneous connections made to each host by tasks within sessions based on this configuration.This limit is per session, so if you use multiple sessions, your app as a whole may exceed this limit. Additionally, depending on your connection to the Internet, a session may use a lower limit than the one you specify.
The default value is 6 in OS X, or 4 in iOS.
Availability
Available in iOS 7.0 and later苹果对同一个IP服务器的并发数进行了严格的限制,如果不采用复用session的话很容易超过限制。
转载地址:http://ajtsi.baihongyu.com/