YTKNetwork 源码解读 (四) 之 YTKBatchRequest 和 YTKChainRequest
这篇是 YTKNetwork 源码阅读的最后一篇,主要讲解的是 YTKBaseRequest(批量请求),YTKChainRequest(链式请求) 两个部分。
YTKBatchRequest
YTKBatchRequest 用于完成批量请求的任务。当初始化时,需要指定 YTKBatchRequest 的数目,后续无法再添加新的请求。随后按添加顺序依次发起请求,当其中的一个请求失败时判定为 YTKBatchRequest 请求失败,同时 cancel 其它正在执行的请求
协议,用于 YTKBatchRequest 请求失败或者成功的回调
这些是 YTKBatchRequest 的属性,大部分看注释就能理解了。
需要注意的是:
- 代理的执行顺序在 block 之前
- tag 需要自己手动赋值来区分 YTKBatchRequest,默认值都是 0
初始化方法,在这里你需要指定 YTKRequest 数组。
个人觉得最好将其它默认的初始化方法给禁用掉
设置 YTKBatchRequest 请求成功和失败的回调,当请求结束后,会调用 -clearCompletionBlock
将 block 置为 nil
YTKRequestAccessory 协议用于执行请求不同阶段的回调
请求的开启和取消
请求的数据是否来自于缓存。所有请求中,如果有一个请求的数据来自于缓存,那么这个方法就会返回 YES
初始化方法,将参数 requestArray 赋值给属性 _requestArray,并且会判断里面的元素是否是 YTKRequest 实例,如果不是的话会返回。
初始化内部属性 finishedCount,该属性表示已完成请求的数目
方法开头会判断属性 finishedCount 的值是否大于 0,如果 0 的话则返回。这说明当 YTKBatchRequest 实例创建只能调用 start
方法一次,再次调用的话可能会出现重复开启任务的问题,这里个人还是觉得要进行下判断比较好。
将 YTKRequest 的 delegate 设置为自己,同时清空 YTKRequest 的 block 回调,以确保只有 YTKBatchRequest 处理请求完成后的回调,最后开启请求
触发即将停止回调 toggleAccessoriesWillStopCallBack,并调用 clearRequest 方法循环将 YTKRequest 进行停止操作,随后将自己从 YTKBatchRequestAgent 中移除。
循环调用 YTKRequest 的 stop 方法
设置 YTKBatchRequest 的完成回调,当所有请求都成功调用或者其中一个失败时使用
可以看到,只要一个请求的数据来自于缓存,那么方法的返回结果就是 NO
当请求成功后,YTKBatchRequest 在这个方法里面处理数据。
- _finishedCount 的值 +1
- 如果 _finishedCount 的值等于请求的个数,说明所有的请求都已请求成功,这种情况表示 YTKBatchRequest 请求成功,执行相应的回调
YTKBatchRequest 在这个方法里面处理请求失败的情况。
一个请求失败意味着 YTKBatchRequest 的失败,所以也不用接着处理那些完成的请求。在这里会循环取消 YTKRequest 请求
接着执行失败回调,并将自己从 YTKBatchRequestAgent 移除。
YTKBatchRequestAgent 是一个单例,作用是强引用 YTKBatchRequest,避免被销毁。当任务执行完毕后,将 YTKBatchRequest 移除
小总结
YTKBatchRequest 是一个批量执行请求的类,能够批量执行 YTKRequest 类型的请求。
请求的开启顺序按照任务的添加顺序执行,单个 YTKRequest 完成后,不会执行 YTKRequest 自己的回调 block,代理等回调方法。
当所有请求成功后,执行 YTKBatchRequest 的代理回调,回调 block; 否则执行 YTKBatchRequest 的失败回调
YTKChainRequest
YTKChainRequest 也是批量处理请求的类,只不过是当前面的请求完成后再执行下一个请求。
YTKChainRequest 完成的回调。可以看到在失败回调中多了一个参数 failedBaseRequest
比较简单,看注释就好了。id<YTKRequestAccessory>
是实现了协议 YTKRequestAccessory 的实例,这个协议里面有请求各种状态的方法,例如将要发起请求,将要结束请求
通过该方法向 YTKChainRequest 里面添加请求,同时设定该请求的完成回调。
我们知道 YTKBaseRequest 可以通过设定属性来设置完成回调,但这里为什么还需要这个方法来设定呢?通过属性设定的回调是否会触发呢?这些在后面会讲到的
一些内部用到的属性
- requestArray:请求数组
- requestCallbackArray:请求完成回调数组,有的请求没有设定回调,那么会往数组里面添加一个什么都不做的空回调
- nextRequestIndex:下一个执行的请求的序号
- emptyCallback:空回调
初始化实例,可以看到 _emptyCallback 其实是一个不执行任何操作的 block
开启任务后,通过 startNextRequest 方法开启第一个请求,并将 YTKChainRequest 添加到单例 YTKChainRequestAgent 中,防止被销毁
该方法用来开启下一个未执行的请求。
_nextRequestIndex 表示该请求在数组中的位置,如果超出了数组范围则返回。
通过 _nextRequestIndex 得到该请求,随后将 delegate 设置为自己,并清除其完成回调,随后开启请求,返回 YES; 否则返回 NO
取消 YTKChainRequest,并将 YTKChainRequest 从单例 YTKChainRequestAgent 中移除。
通过调用 clearRequest 方法取消当前的请求
获取到当前的 YTKBaseRequest,由于 _nextRequestIndex 表示下一个未执行的请求位置,所以这里要 -1。
清空 _requestArray 和 _requestCallbackArray 这两个数组
添加请求及其完成回调。
在 startNextRequest 方法中,我们知道,开启单个任务 YTKBaseRequest 之前,会将 YTKBaseRequest 的 delegate 设置为自己,并清除其回调 block。
所以,这里我们需要通过 _requestCallbackArray 这种方式来额外添加回调
需要注意的是该回调仅在请求成功时被调用
这里是 YTKBaseRequest 的代理方法,当请求成功后调用。
从 _requestCallbackArray 数组中获取该请求的完成回调。当所有的请求都获取成功后,执行 YTKChainRequestAgent 的完成回调
这里是 YTKBaseRequest 的代理方法,当请求失败后调用。需要注意的是,当单个 YTKBaseRequest 请求失败,判断 YTKChainRequestAgent 请求失败,执行其完成回调
如果你想执行 YTKBaseRequest 的失败回调,你可以在代理方法 chainRequestFailed:failedBaseRequest:
中,通过 YTKBaseRequest 得到响应数据,随后执行后续操作
小总结
YTKChainRequest 是一个批量同步执行请求的类,能够批量执行 YTKBaseRequest 类型的请求。
你可以自定义 YTKChainRequest 的实例方法添加 YTKBaseRequest 和 成功回调。
不同于 YTKBatchRequest,YTKChainRequest 中可添加的 request 类型是 YTKBaseRequest 而不是 YTKRequest
YTKNetwork 源码解读 (四) 之 YTKBatchRequest 和 YTKChainRequest
http://example.com/2020/08/12/YTKNetwork-源码解读-四-之-YTKBatchRequest-和-YTKChainRequest/