本文不对 AFNetworking
作全面的解析,仅比照解析一下 2.x
和3.x
的差别。
AFNetworking
源码剖析全套教程点击获取
1. 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
为什么要串行回调
- (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
回调导致的多线程并发,还会导致性能的节约
查看原文