iOS开发征服iOSiOS 大神之路

AFNetworking源码——多线程(2.0 & 3.

2017-07-29  本文已影响524人  郑明明

由于AFNetworking本质上是对NSURLConnection和NSURLSession进行了封装设计,作为一个优秀网络请求框架,必然对多线程这一块的处理有自己的良好设计,本文分别探究2.0和3.0时代对于多线程的设计方案


AFNetworking 2.0

对于2.0时代,框架采用了NSURLConnection+NSOperation的模型,那么来分析一下AF是如何进行请求的管理,以及回调的处理的,我们尝试列出几种方案:

[self performSelector:@selector(operationDidStart)
              onThread:[[self class] networkRequestThread]          withObject:nil
         waitUntilDone:NO
                 modes:[self.runLoopModes allObjects]]
AFNetworking 3.0

AF的3.0时代进行了大改动,其内部实现从基于NSURLConnection变成了NSURLSession,在3.0的设计思路这这篇文章中解析了3.0是如何对NSURLSession进行封装的,这里我们直接看一下对应的源码:

    self.operationQueue = [[NSOperationQueue alloc] init];
    self.operationQueue.maxConcurrentOperationCount = 1;
    self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];
总结

之所以设计方式不同了,有原因来自:2.0时代的NSURLConnection是一个全局的设计,从调用方式也能发现:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"www.nineteen.me"]];
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {
    // ...
}];

而NSURLSession是将Session和task进行了分离,可以从使用看出:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration
                                                      delegate:self
                                                 delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionDataTask *task = [session dataTaskWithURL:[[NSURL alloc]initWithString:@""]];
[task resume];

这样的设计就能够为每个session对象(AFURLSessionManager对象)添加独自的操作队列NSOperationQueue,分别进行各自的请求发送和回调管理。而2.0中使用全局设计,因此AF维护一条子线程专门用于管理所有的请求发送和回调处理。

上一篇下一篇

猜你喜欢

热点阅读