Alice Pre: 起源

写一个 HTTP 客户端的决定发生在五月。

但想法的萌芽要早很多。

去年因为工作,我写了一段时间的 nodejs。

彼时的日常是 async/awaitpromise,新鲜的模型与灵活的语法给我带来了极棒的开发体验,异步任务的调度流程从来没有这么简单友好,koa 的洋葱架构更是让我开了眼界,superagent 让我知道 API 原来可以这样设计。

回到 Swift 后,我开始反省,首先反省的是那些常用的异步 API:file,events,network,等等等等。delegate 和 callback 在我眼里变得不那么好用,「流」才是异步的理想具象,可扩展性(extensible)深入我心,插件代表着无限可能。

我开始想,Swift 的下一代 HTTP 客户端应该长什么样?

我很喜欢 Alamofire,虽然已经很久没有直接使用它了。

它一直是我心中的 t1 库,mattt 的「文笔」质朴无华、舒卷自如,一直是我心中的 t1 程序员,Alamofire 大到结构,小到命名,一脉相承地整齐、适当。

但它已经「旧」了。简单的回调已经满足不了越加复杂的异步需求,Rx 可以给它续上一命,但 Alamofire 自己也需要改革。我不喜欢 jshierAlamofire 5.0 中带来的重构,在我看来,其中一些是进步,一些则是让人遗憾的误解。「我会单独写一篇对 Alamofire 5.0 的评论分享我的看法。」

我决定自己试着写一个 HTTP 客户端。

它的关注点要有:

  1. 异步
  2. 友好
  3. 可扩展
  4. 性能
  5. ……

✨✨✨✨✨✨✨

Alice 的第一个提交发生在 5 月。6 月时出了一个小小的意外——Apple 在 WWDC 发布了 Combine

接下来的两个月我的注意力被 Combine 截胡。

我很喜欢 Rx 模型,它把 stream 的概念表现地相当到位。但 RxSwift 的源码实在有些「乱糟糟」,几次阅读都开始得兴致勃勃结束得索然无味。重新实现一遍 Rx 一直是我的心头想。Combine 发布时,我意识到这是一个极好的学习机会。接下来,我的业余时间都拿来写 CombineX 和几个相关扩展:CXCocoaCXCompatible ……

打个广告,CombineX 是一个 Combine 的开源实现,它可以作为 Combine 的 polyfill在 iOS 8,macOS 10.10 以及 Linux 上使用。我会在几天后开始更新 CombineX 系列:如何实现一个 Rx。欢迎关注!😉

Alice 就这样被搁浅了几个月……

现在,让我们重新开始。


#swift #http #future #alice #alice-serial

Comments