AFNetworking源码笔记

1、AFNetworking2.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;
}

看过AFNetworking2.0的都知道这段代码,_networkRequestThread是一个常驻线程,用于异步发起请求,这个版本的AFNetworkingNSURLConnection异步发起请求,请求发出后这个线程就退出了,等到回调以后线程不在了,就无法处理返回结果了,所以为了每个请求都能接收到返回结果,就需要线程常驻,并且每次请求都使用这个线程,不需要每次都创建新的子线程。

为什么3.0却不需要?

iOS9.0废弃了NSURLConnection,使用了NSURLSession来发起网络请求

    self.operationQueue = [[NSOperationQueue alloc] init];
    self.operationQueue.maxConcurrentOperationCount = 1;

    self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];

self.operationQueue这个队列就是用来处理请求回调的,不再需要常驻线程来处理回调,maxConcurrentOperationCount设置为1,是为了串行的处理回调结果。

你可能感兴趣的:(AFNetworking源码笔记)