乐趣区

关于ios:iOS-初探-AFNetworking

本文不对 AFNetworking 作全面的解析,仅比照解析一下 2.x3.x的差别。

AFNetworking源码剖析全套教程点击获取

1. AFNetworking分为如下 5 个功能模块:

  • 网络通信模块(AFURLSessionManager、AFHTTPSessionManger)
  • 网络状态监听模块(Reachability)
  • 网络通信安全策略模块(Security)
  • 网络通信信息序列化 / 反序列化模块(Serialization)
  • 对于 iOS UIKit 库的扩大(UIKit)
  1. AFNetworking 2.x须要常驻线程而 3.x 不须要常驻线程
    2.x 常驻线程用来并发申请和解决数据回调,防止多个网络申请的线程开销 (不必开拓一个线程,就保活一条线程);而3.x 不须要常驻线程是因为 NSURLSession 能够指定回调 delegateQueueNSURLConnection 不行;
    NSURLConnection的一大痛点就是:发动申请后,须要始终处于期待回调的状态。而 3.xNSURLSession解决了这个问题;NSURLSession发动的申请,不再须要在以后线程进行回调,能够指定回调的delegateQueue,这样就不必为了期待代理回调办法而保活线程了
  2. 3.x须要设置最大并发数为 1(self.operationQueue.maxConcurrentOperationCount = 1),2.x为什么不须要
    性能不一样:3.xoperationQueue 是用来接管 NSURLSessionDelegate 回调的,鉴于一些多线程数据拜访的安全性思考,设置了 maxConcurrentOperationCount = 1 来达到并发的申请串行的进行回调的成果。而 2.xoperationQueue是用来增加 operation 进行并发申请的,所以不要设置为 1

留神 并发数并不等于所开拓的线程数,具体开拓几条线程由零碎决定

  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 回调导致的多线程并发,还会导致性能的节约
查看原文

退出移动版