上一篇从原生的请求方式,再到AFNetworking的简单介绍和使用,熟悉AFNetworking的基本结构和以GET请求为例的使用流程,那本文开始针对每一个模块来进行分析,同样是需要带着问题:AFNetworking到底做了些什么事情,为什么要这么做?
本文主要来看网络通信模块(AFURLSessionManger,AFHTTPSessionManager),首先看看这两个类之间的关系,以及他们内部都包含哪些模块,用来做什么的:
由此可见,首先AFURLSessionManger是AFHTTPSessionManager的父类,其中AFURLSessionManger内部还包含AFURLSessionManagerTaskDelegate和_AFURLSessionTaskSwizzling;AFHTTPSessionManager本身是对网络请求做了一些简单的封装,请求的整个逻辑是分发给AFURLSessionManager或者其他类去做的;其内部管理自己的两种序列化工具,用来对请求和响应的数据做序列化;同时依赖于父类提供的保证安全,监控网络状态,实现发出HTTP请求的核心功能;
下面分别来介绍;
一、AFURLSessionManger
1、AFURLSessionManger功能作用以及提供了哪些接口;
(1)功能作用
AFURLSessionManager负责生成对应的NSURLSession的实例,管理AFNetworkReachabilityManager和AFSecurityPolicy,以此一来查看网络的连接情况,二来保证请求的安全,同时初始化生成一个AFJSONResponseSerializer的实例来序列化HTTP的响应结果;
(2)属性和接口方法
核心的方法包括:初始化方法;针对不同任务的request方法;
初始化方法的实现在上文已经详细讲过,最终生成一个AFURLSessionManager的实例对象;上文在以GET请求为例的时候发送请求过程的时候介绍了dataTaskWithRequest,这里主要来看一下uploadTaskWithRequest、downloadTaskWithRequest和downloadTaskWithResumeData这三个方法:
uploadTaskWithRequest根据不同的数据创建一个NSURLSessionUploadTask任务,最终都会走到addDelegateForUploadTask为对应的uploadTask设置代理;addDelegateForUploadTask这个方法上文具体讲述过;
downloadTaskWithRequest:使用指定的请求request来创建对应的NSURLSessionDownloadTask,并且为所创建的task设置代理,最终将其返回;
downloadTaskWithResumeData:使用已经下载的部分数据 resumeData 创建一个下载任务,继续进行下载。并且为所创建的task设置代理,最终将其返回;
uploadProgressForTask和downloadProgressForTask 这两个方法是用来获取上传或者下载的进度;另外还有一些自定义的block的set方法。关于这一点,里边使用到的一些自定义的block回调,作者在.m文件中声明一些block属性,并且复写了其set方法,然后又在.h文件中声明这些set方法:这样做的目的看来是为了使用方便,我们在调用set方法设置这些block,能够很清晰的看到block的各个参数与返回值;
(3)代理实现: 上文最后提到AFURLSessionManager遵守的代理都有NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate, NSSecureCoding, NSCopying;对应实现了这些代理中的一些方法,部分如图所示:
遵守的这些代理,最终AFURLSessionManager对这些代理做了一些公共的处理,最终转发到自定义的代理AFURLSessionManagerTaskDelegate的3个代理方法中,用来负责把每个task对应的数据回调回去;
在AFURLSessionManager里边重要的代理包括NSURLSessionTaskDelegate,NSURLSessionDataDelegate以及NSURLSessionDownloadDelegate,这里重点是看源码的实现,以下是AFURLSessionManager实现的NSURLSessionDownloadDelegate****代理:
在AFURLSessionManager中实现了NSURLSessionDownloadDelegate的三个代理方法,分别如下:
这三个代理方法分别用来对下载任务进行处理,依次是下载完成时的调用,周期性通知下载进度的调用,当下载被取消或者失败后重新恢复下载时的调用;这三个代理方法最终都会进行代理转发,到AFURLSessionManagerTaskDelegate中,AF中的deleagate是需要对应每个task去私有化处理的。对应看看AFURLSessionManagerTaskDelegate中的这三个代理方法都做了什么 吧:
在 🙋🙋🙋 下载完成时的调用代理方法中,AFURLSessionManager和AFURLSessionManagerTaskDelegate中都进行了文件路径的移动,而NSURlSession代理的下载路径是所有request公用的下载路径,设置之后所有的request都会下载到之前的那个路径。而AFURLSessionManagerTaskDelegate中对应到每一个task中,每一个task可以设置自己的下载路径;
总结:这些代理方法在AFURLSessionManager中实现的时候都是对session做一个公共的处理,每一个不同的task进行特定的处理时,需要将代理转发到AFURLSessionManagerTaskDelegate中,在AFURLSessionManagerTaskDelegate的代理中实现;
2、AFURLSessionManagerTaskDelegate的作用
主要用来管理进度;并且在task结束的时候回调使用;在上述提到AFURLSessionManagerTaskDelegate中关于NSURLSessionDownloadDelegate的代理方法实现,对应到每一个task中,每一个task可以设置自己的下载路径;相应的也实现了NSURLSessionDataDelegate,NSURLSessionTaskDelegate;这些代理都是用来对当前特定的task做处理;
监听的处理方法,observeValueForKeyPath,这个方法是用来当datatask状态发生改变时的监控处理逻辑,调用block回调,用户拿到进度;
3、_AFURLSessionTaskSwizzling的作用
用来修改NSURLSession的resume和suspend方法,使用af_resume和af_suspend这两种方法来替换原有的resume和suspend方法;这样做是为了在方法resume或者suspend被调用时发出通知;
load方法中采用OC中Runtime的method swizzling来进行实现, AFNetworkingTaskDidResumeNotification来通知当前的任务状态为resume,那么就需要调用taskDidResume:函数,而想要调用taskDidResume:函数就得调用af_resume函数。同理,AFNetworkingTaskDidSuspendNotification来通知当前的任务状态为suspend,那么就需要调用taskDidSuspend:函数,而想要调用taskDidSuspend:函数就得调用af_suspend函数。
二、AFHTTPSessionManager
1、功能作用
AFHTTPSessionManager本身是对网络请求做了一些简单的封装,请求的整个逻辑是分发给AFURLSessionManager或者其他类去做的;其内部管理自己的两种序列化工具,用来对请求和响应的数据做序列化;同时依赖于父类提供的保证安全,监控网络状态,实现发出HTTP请求的核心功能;
2、属性和接口
来看看AFHTTPSessionManager的一些方法的实现,初始化方法最终都会调用到AFURLSessionManager中的初始化方法完成sessionManager的初始化;
当以某一种方式发送一个网络请求的时候,以GET为例:
做两件事情:一是生成一个dataTask任务,二是调用resume开启请求;
该类的一个核心方法:dataTaskWithHTTPMethod,使用自定义“HTTPMethod”请求创建“NSURLSessionDataTask”。
该方法做了两件事情:一是对请求参数进行序列化;二是调用dataTaskWithRequest方法生成后一个datatask任务;最终返回一个datatask;
总结:到此,网络通讯模块所做的事情就到此,在该模块中主要的任务就是发起网络请求。分成AFURLSessionManger和 AFHTTPSessionManager两部分来做处理。 AFURLSessionManger是AFHTTPSessionManager的父类,其中AFURLSessionManger内部还包含AFURLSessionManagerTaskDelegate和_AFURLSessionTaskSwizzling;AFHTTPSessionManager本身是对网络请求做了一些简单的封装,请求的整个逻辑是分发给AFURLSessionManager或者其他类去做的;其内部管理自己的两种序列化工具,用来对请求和响应的数据做序列化;同时依赖于父类提供的保证安全,监控网络状态,实现发出HTTP请求的核心功能;
附:同上文,学习过程有参考网上对于AFNetworking源码的解析学习帖子;