iOS中基于http协议上传下载一般用大名鼎鼎的网络库AFNetworking,一般在项目中还会对此库进行二次封装,本片文章将介绍唐巧团队开源的基于AFNetworking二次封装的开源库YTKNetworkGitHub - AFNetworking/AFNetworking: A delightful networking framework for iOS。
注:本文解析是基于YTKNetwork1.x版本,目前YTKNetwork已经更新到了2.x版本,具体的区别见YTKNetwork 2.0 迁移指南
一、YTKNetwork提供的功能
YTKNetwork除了具备AFNetworking所有功能外,还提供如下高级功能:
1、支持按时间缓存网络请求内容
2、支持按版本号缓存网络请求内容
3、支持统一设置服务器和 CDN 的地址
4、支持检查返回 JSON 内容的合法性
5、支持文件的断点续传
6、支持 block 和 delegate 两种模式的回调方式
7、支持批量的网络请求发送,并统一设置它们的回调(实现在YTKBatchRequest类中)
8、支持方便地设置有相互依赖的网络请求的发送,例如:发送请求A,根据请求A的结果,选择性的发送请求B和C,再根据B和C的结果,选择性的发送请求D。(实现在YTKChainRequest类中)
9、支持网络请求 URL 的 filter,可以统一为网络请求加上一些参数,或者修改一些路径。
10、定义了一套插件机制,可以很方便地为 YTKNetwork 增加功能。猿题库官方现在提供了一个插件,可以在某些网络请求发起时,在界面上显示"正在加载"的 HUD。
具体的使用可以见YTKNetwork github官网,下面着重讲解一下YTKNetwork的架构
二、YTKNetwork原理
1、架构图如下:
2、相关类介绍
1)YTKBaseRequest:网络请求基类,通过成员变量requestOperation发起http请求
2)YTKRequest:单个网络请求类,项目中的网络请求直接继承该类。该类继承于YTKBaseRequest,通过调用YTKNetworkAgent全局单例对象方法- (void)addRequest:(YTKBaseRequest *)request发起网络请求
3)YTKBatchRequest:批量网络请求类,通过此类来实现批量发送请求
4)YTKBatchRequestAgent:管理YTKBatchRequest对象类,该类在实现上是一个全局单例对象
5)YTKChainRequest:串行网络请求类,通过该类来实现有依赖关系的网络请求
6)YTKChainRequestAgent:管理YTKChainRequest对象类,该类在实现上是一个全局单例对象
7)YTKNetworkAgent:网络代理类,该类实际上是一个胶水层,YTKRequest通过方法addRequest管理YTKRequest对象,并且通过AFHTTPRequestOperationManager把YTKRequest代表的url请求路由到AFNetworking里面
由于YTKNetwork基于AFNetworking来实现的,顺便介绍一下AFNetworking相关的类,按功能来说明:
网络请求类:
1)AFURLConnectionOperation:实际发起网络请求与处理网络相应数据的类。该类继承于NSOperation,并且实现了协议NSURLConnectionDelegate、NSURLConnectionDataDelegate、NSSecureCoding、NSCopying
2)AFHTTPRequestOperation:继承于AFURLConnectionOperation,AFHTTPRequestOperationManager调用
序列化与反序列化类
1)AFHTTPRequestSerializer:http请求参数序列化为标准http参数类。该类通过实现协议AFURLRequestSerialization来实现序列化
2)AFJSONRequestSerializer:http请求参数序列化为JSON格式类。继承于AFHTTPRequestSerializer
3)AFPropertyListRequestSerializer:请求参数序列化成application/x-plist格式类。继承于AFHTTPRequestSerializer:http
4)AFHTTPResponseSerializer:响应数据反序列化类,该类通过实现AFURLResponseSerialization协议来实现反序列化
5)AFJSONRequestSerializer:响应数据反序列化为JSON格式类。
6)AFXMLParserResponseSerializer:响应数据反序列化为XML格式类
7)AFPropertyListResponseSerializer:响应数据反序列化为property list格式类
8)AFImageResponseSerializer:响应数据反序列化为UIImage格式类
9)AFCompoundResponseSerializer:暂时不清楚用法
AFHTTPRequestOperationManager:直接给业务层使用的类。业务直接通过该类的Head、Post、Get方法创建请求。该类的
AFHTTPSessionManager:直接给业务层使用的类.通过NSURLSession来实现网络请求
其他类:UIKit目录下的扩展类,可以拿来从网络上加载图片,比如UIImageView+AFNetworking扩展