本文不对AFNetworking
作全面的解析,仅对比解析一下2.x
和3.x
的差异。
AFNetworking
分为如下5个功能模块
:
- 网络通信模块(
AFURLSessionManager、AFHTTPSessionManger
) - 网络状态监听模块(
Reachability
) - 网络通信安全策略模块(
Security
) - 网络通信信息序列化/反序列化模块(
Serialization
) - 对于
iOS UIKit
库的扩展(UIKit
)
AFNetworking 2.x
需要常驻线程而3.x
不需要常驻线程2.x
常驻线程用来并发请求和处理数据回调
,避免多个网络请求的线程开销(不用开辟一个线程,就保活一条线程
);而3.x
不需要常驻线程是因为NSURLSession
可以指定回调delegateQueue
,NSURLConnection
不行;NSURLConnection
的一大痛点就是:发起请求后,需要一直处于等待回调的状态
。而3.x
后NSURLSession
解决了这个问题;NSURLSession
发起的请求,不再需要在当前线程进行回调,可以指定回调的delegateQueue
,这样就不用为了等待代理回调方法而保活线程了3.x
需要设置最大并发数为1
(self.operationQueue.maxConcurrentOperationCount = 1
),2.x
为什么不需要
功能不一样:3.x
的operationQueue
是用来接收NSURLSessionDelegate
回调的,鉴于一些多线程数据访问的安全性考虑,设置了maxConcurrentOperationCount = 1
来达到并发的请求串行的进行回调
的效果。而2.x
的operationQueue
是用来添加operation
进行并发请求
的,所以不要设置为1
注意:并发数并不等于所开辟的线程数,具体开辟几条线程由系统决定3.x
为什么要串行回调1
2
3
4
5
6
7
8
9- (AFURLSessionManagerTaskDelegate *)delegateForTask:(NSURLSessionTask *)task {
NSParameterAssert(task);
AFURLSessionManagerTaskDelegate *delegate = nil;
[self.lock lock];
//给所要访问的资源加锁,防止造成数据混乱
delegate = self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)];
[self.lock unlock];
return delegate;
}从代码可以看出,这边对
self.mutableTaskDelegatesKeyedByTaskIdentifier
的访问进行了加锁,目的是保证多线程环境下的数据安全
。既然加了锁,就算maxConcurrentOperationCount
不设为1
,当某个请求正在回调时,下一个请求还是得等待一直到上个请求获取完所要的资源后解锁,所以这边并发回调也是没有意义的。相反多task
回调导致的多线程并发,还会导致性能的浪费