用了这么久的AFNetworking,现在终于有时间把它的源码实现读了一遍。不跟你多哔哔,直入正题:这里以Http的“POST”请求网络的方式来简单分析一下。
首先介绍一下AFNetworking的文件大致结构,如下图跟网络请求相关的文件就是四部分(NSURLSession、Reachbaility、Security、Serialization)
一个网络请求以调用AFHTTPSessionManager中的如下方法作为入口:
可以看到内部实现是调用了另一个方法来返回dataTask,然后调用[dataTask resume];方法来开始一个网络请求(因为一个dataTask默认是挂起状态,需要手动调用resume方法来启动)。这里还可以看到dataTask是作为返回值返回给调用者,这将非常有用,因为我们可以拿到dataTask,然后对它进行一系列操作(暂停、取消等),有很高的自定义性。这里举一个应用dataTask的例子:在做即时搜索(就是输入框的内容改变的时候就去触发一个网络请求,搜索一次)的时候,在我们输入的速度很快的时候,前一次的网络请求我们就可以通过dataTask来取消掉,使性能更优;接下来我们进一步深入探索AFNetworking是怎么实现网络请求的。如下图:(两张图展示的是一个方法)
通过self.requestSerializer获得request 这个方法里有一个亮点,就是通过kvo和kvc的技术为request动态设置属性值(allowsCellularAccess、cachePolicy、HTTPShouldHandleCookies、HTTPShouldUsePipelining、networkServiceType、timeoutInterval)。感兴趣的可以去仔细研究下这样设计的好处。接下来我们看获得dataTask和执行回调的重要方法的实现,如下图:
由于AFHTTPSessionManager是继承于AFURLSessionManager的,所以此方法是在AFURLSessionManager中实现的(同学们可以思考下这种设计的好处)。接下来我们来看看为dataTask设置代理的方法到底做了什么,看下图:
上图中的方法为每个dataTask都设置了对应的代理,代理的作用是:当请求结束的时候根据dataTask找到对应的delegate,然后由delegate来执行完成回调或者失败的回调。需要注意的是这里的delegate不是我们平常写代码时候的那种属性代理,这儿的‘delegate’只是跟代理的作用很像,所以叫做delegate,其实只是一种一一对应的形式,把dataTask对用的各种对调赋值给了‘delegate’,然后‘delegate’可以来帮助dataTask执行回调(同学们可以思考下‘为什么不直接写一个子类集成于dataTask然后为其添加一个代理属性,来实现真正的意义上的代理呢?’)。到这里创建和配置dataTask已经完成,接下来我们来看看请求完成的时候,AFN是怎么回调的,请看下图:
从图中可以看到正如我们上面提到的,是根据delegate来完成回调的,让我们接着看看[delegate URLSession:session task:task didCompleteWithError:error];这个方法里做了什么?由于方法中代码太长,截图不好截,因此下图中只是请求没有出错的情况下执行回调的代码:
以上便是我对AFNetworking的简单分析,可能有些理解不对之处,请大神指正!!!