AFN常驻线程的理解(从2.x到3.x)

最常见的问题:AFN为什么添加一条常驻线程 问这个问题的人大部分是停留在2.x版本的理解,从3.x开始AFN已经不需要常驻线程了。这里涉及到从NSUrlNSURLConnection到NSURLSession的演变。

2.x版本常驻线程的分析


在2.x版本的AFN中,使用的是NSURLCollection进行封装。NSURLConnection的网络请求是异步发起的,事件和结果的回调在原来线程的RunLoop中进行。

  1. 在请求完成后我们需要对数据进行一些序列化处理,或者错误处理。如果我们在主线中处理这些事情很明显是不合理的。不仅会导致UI的卡顿,甚至受到默认的RunLoopModel的影响,我们在滑动tableview的时候,会导致时间的处理停止。

  2. 这里时候我们就需要一个子线程来处理事件和网络请求的回调了。但是,子线程在处理完事件后就会自动结束生命周期,这个时候后面的一些网络请求得回调我们就无法接收了。所以我们就需要开启子线程的RunLoop来保存线程的常驻。

  3. 当然我们可以每次发起一个请求就开启一条子线程,但是这个想一下就知道开销有多大了。所以这个时候保活一条线程来对请求得回调处理是比较好的一个方案。

-- 下面是2.x版本的常驻线程的开启代码 --

+ (void)networkRequestThreadEntryPoint:(id)__unused object {
    @autoreleasepool {
        [[NSThread currentThread] setName:@"AFNetworking"];
 
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
        [runLoop run];
    }
}
 
+ (NSThread *)networkRequestThread {
    static NSThread *_networkRequestThread = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        _networkRequestThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkRequestThreadEntryPoint:) object:nil];
        [_networkRequestThread start];
    });
    
    return _networkRequestThread;
}

这里的一些小知识点就是单例的创建,RunLoop的开启。至于这些详细信息,就不在这里另行记录,可以再去查询详细的信息。

3.x版本不在常驻线程的分析


在3.x的AFN版本中使用的是NSURLSession进行封装。对比于NSURLConnection,NSURLSession不需要在当前的线程等待网络回调,而是可以让开发者自己设定需要回调的队列。

所以在3.x版本中AFN使用了NSOperationQueue对网络回调的管理,并且设置maxConcurrentOperationCount为1,保证了最大的并发数为1,也就是说让网络请求串行执行。避免了多线程环境下的资源抢夺问题。

总结


关于AFN为什么要开辟一条常驻线程的问题,我们得区分清楚,常驻线程其实是在2.x版本中的,究其原因是2.x和3.x版本分别使用的是NSURLConnection和NSURLSession。由于NSURLSession不需要再当前线程等待网络请求得回调结果,所以说在AFN中就不需要常驻线程等待回调,而是交给NSOperationQueue来处理,让系统自己来决定是否需要开启新的线程。

并且设置maxConcurrentOperationCount为1,让回调串行执行。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,148评论 1 32
  • 1.请简单说明多线程技术的优点和缺点? 优点能适当提高程序的执行效率能适当提高资源的利用率(CPU/内存利用率) ...
    彼岸的黑色曼陀罗阅读 503评论 0 2
  • 说实话,AFN是个博大精深的东西,作为一款全世界都在使用的iOS框架想要一下子就参透也是不大可能的,但是,我还是要...
    8fe8946fa366阅读 848评论 2 2
  • AF2.x为什么需要常驻线程? NSURLConnection 先来看看 NSURLConnection 发送请求...
    evanleeeee阅读 881评论 0 52
  • 思绪很多,去梳理不清楚,随便写写。 今天竟然看完了一本书《可可西里的诱惑》这是一个汽车公司为了宣传自己的新车,和一...
    A章正洪阅读 250评论 5 1