iOS之AFNetworking3.0

在AFNetworking升级到3.0之前,对于网络的请求是基于NSURLConnection,到3.0之后,已完全基于NSURLSession的API,这降低了维护的负担,同时支持苹果增强关于NSURLSession提供的任何额外功能。

下面的类已从AFNetworking 3.0中废弃:

AFURLConnectionOperation
AFHTTPRequestOperation
AFHTTPRequestOperationManager
修改的类

下面的类包含基于NSURLConnection的API的内部实现。他们已经被使用NSURLSession重构:

UIImageView+AFNetworking
UIWebView+AFNetworking
UIButton+AFNetworking

AFHTTPRequestOperationManager2.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的话很容易超过限制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值