Hydra 是一个 Swift 3 编写的异步框架, 它轻量级并且支持几乎所有的异步方法 like always
, validate
, timeout
, retry
, all
, any
, pass
, recover
, map
, zip
, defer
and retry
等等
其实, 在我们已经习惯了 RXSwift 或者 ReacativeCocoa 的时候, 我们也许永远也用不到 Hydra, 但是刚才说的两个函数响应式的类库不仅仅是包含了异步的功能, 其实更确切的说异步只是响应式的一种表现形式, 我个人是非常希望通过一个库来好好学习一下底层异步的实现以及封装, 所以, 我选择了 Hydra
两个概念
第一个核心概念就是 Promise, 我最早知道这个概念是通过 JS, 他能很好的实现连续的异步调用, 消除了被我们称之为 "回调地狱" 的代码风格, 让我们更加优雅的把注意力集中到业务本身, Hydra 其实就是 Promise 的 Swift 版本而已, 关于 Promise 的细节, 网上一搜一大堆, 我就不在赘述了.
第二个核心概念就是 GCD, 做 iOS 或者 Mac 开发不知道 GCD 简直就是个笑话, Hydra 的底层就是使用 GCD 实现的, 更多细节问题, 我会在之后的代码中向大家一一说明.
从原理说起
Promise 在我的理解中其实就是状态的传递, 如果抛除未运行的话, 无非 成功
or 失败
两种, Promise 的连续调用无非就是捕获当前的状态, 并生成新的状态, 之后向下传递.
internal enum State<Value> {
case pending
case resolved(_: Value)
case rejected(_: Error)
...
}
那么有了状态, 配套的就要有人去监听状态的变化, 这里封装了 Observe 来监听, 当 Observe 发生了变化或者 State 发生了变化的时候, 都会调用相应的 Observe 的方法
internal enum Observer<Value> {
typealias ResolveObserver = ((Value) -> (Void))
typealias RejectObserver = ((Error) -> (Void))
case onResolve(_: Context, _: ResolveObserver)
case onReject(_: Context, _: RejectObserver)
...
}
Promise 的方法及其实现方式
一个基本的概念就是, 下面的方法基本都会返回一个新的 promise, 而新的 promise 的 resolve 和 reject 是被包装成为 Observer 被添加到老 promise 中, 当老 promise 任务结束, 触发对应的 observer
All
概念就是监听多个异步 Promise, 全部成功调用 resolve, 出现错误调用 reject
实现方式是使用一个值记录未完成的任务, 当未完成的任务为 0 的时候, 结束任务, 感觉与 GCD Group 类似, 区别就是如果发生任何的错误, 立刻停止所有调用
Always
always 就是无论任务成功还是失败都会调用 always 的方法
实现方式是 把 resolve 和 reject 都包装成为 Observer, 并且在 Observer 的执行方法中均执行 always 的 body
Any
Any 的含义就是让多个 promise 监听一个 promise, 实现方式也很简单, 就是把所有的监听 promise 全部作为 observer 添加到 目标 Promise 中
Catch
catch 作为 promise 最基础的用法之一, 就是为了截获错误, 当之前的 promise 出现 error 的时候, 触发 catch promise 的 observer 对象, 执行 catch 的 body 函数
Defer
这个其实是配合 then 使用的, 在 then 的 body 被调用的时候, 使用 queue.asyncAfter 延后执行
Map
map 分为两种形式, 第一种为并列方式, 其实与 all 相同, 第二种为 连续方式 其实内部实现就是 使用 reduce 函数, 连续使用调用 then 函数监听前面的 promise
Pass
这个就没什么可说的了, 就是无论前面传回来什么, 直接进行下面的 promise
Recover
当前面发生错误的时候, 可以在这里尝试处理错误, 内部实现是 连续使用了 then 和 catch 并且在 catch 中 调用 Recover body
Reduce
与 map 的 连续类型相同, 内部使用了 reduce 函数连续 then 前面一个 promise
Then
then 是 promise 的最常用也是最基础的方法了, 就是接收上一个, 实现方式也是最基本的 给 旧的 promise 添加 observer
Retry
执行 promise, 当失败的时候重新执行 任务, 内部的实现原理是 在 reject 的 observer 的执行方法中, 去判断是否需要 retry, 如果需要的话, 重新执行 promise, 知道成功 或者重试次数到达上线
Timeout
超时调用, 即是在任务如果超时了, 直接返回超时 error, 实现方式是在执行任务的同时添加一个 gcd after 方法, 如果这个方法被调用了, 直接返回 错误
Validate
对返回的结果进行验证, 实现方式是在 promise then 方法中进行 Validate
Zip
这个是把多个 promise 同时执行, 并且把返回结果打包成为元祖返回, 内部使用的是 promise all 方法
写在最后
我们在使用异步框架的时候, 往往只使用其中最基础的功能, 一些高级功能我们并不会使用甚至根本都不知道是什么意思, 在这里, 我对 Hydra 的一些方法进行了简单描述, 这些方法名基本都是通用的, 下次你再看到这些名字的时候, 我希望你知道它是干什么的, 并且勇敢的使用它们