Hydra 一个优雅的轻量级的 Swift 异步库

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 的一些方法进行了简单描述, 这些方法名基本都是通用的, 下次你再看到这些名字的时候, 我希望你知道它是干什么的, 并且勇敢的使用它们

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容