frp - ShenYj/ShenYj.github.io GitHub Wiki
FRP,全称为Functional Reactive Programming,是一种响应变化的编程范式
开始学习并使用 RxSwift 是在 2021年4月中旬,第一次了解函数响应式编程应该是2016年左右的事了,当时比较火的是 RAC。
在开始决定使用函数响应式编程框架时,我对它们几个方案并不是时分了解,RAC、ReactiveSwift、RxSwift,还有能搜索到的一些很接近的名称,对此我一时头大,因此也查阅了一些网文进一步了解对比,最终选择了 RxSwift 的方案
iOS目前的响应式编程方案
- ReactieCocoa(RAC)
- RxSwift
- Combine
ReactiveCocoa
是一个比较早的开源项目,从 Objective-C 时期开始
后来从 3.0 开始支持了 Swift (可以通过 bridge 在 Objective-C 下使用),接着就完全停止了在 Objective-C 上的维护
到了 5.0 更是将 RAC 拆分为四个库:ReactiveCocoa、ReactiveSwift、ReactiveObjC、ReactiveObjCBridge,用于区分 Objective-C 和 Swift 开发。
RxSwift
项目晚于 ReactiveCocoa。
RxSwift
是按照 ReactiveX 这个组织的规定下开发的,并且所有其他语言的 Rx 项目也是一样,只是语言语法上的差异,也就是说掌握了一门语言的 Rx 框架再去转换其他语言的 Rx 实现是很快的。
Combine
是苹果在 iOS 13.0 开始提供的一套框架,目前我对这个框架学习不多,在除此方案选型时,简单看了 RxSwift (还未开始深入学习使用,只是看了看 api)后再看了眼 Combine 后,直接扭头去学 RxSwift了,原因有两点
- Combine 感觉就是 RxSwift的子集,功能还没完善就放出来了,一个早产儿
- iOS 13.0 +
早前查阅资料了解了一些信息(目前整理凭借记忆、印象)
FRP 最早起源于微软,后被 RAC 团队借鉴并 基于 Object-C 开发了开源框架 RAC
ReactiveX 是 Reactive Extensions
的缩写, 一般简写为 Rx
, 最初是LINQ的一个扩展,是由微软的架构师 Erik Meijer 领导的团队开发,在2012年11月开源,Rx
是一个编程模型,目标是提供一致的编程接口,帮助开发者更方便的处理异步数据流,并开始支持更多主流的编程语言, Rx
的大部分语言库由 ReactiveX 这个组织负责维护
所以从历史来看, RxSwift 血统更正, 功能上两者都有优势,Ash Furrow 给出的建议就是尽可能都去尝试使用,然后选择适合自己的
在 RxSwift 交流群中有大佬表示 RAC 的操作符、方法命名更贴切,在 RxSwift 6.0 也进行了大量的命名调整
不同点:
- Hot、Code Signal实现API不同:RAC设计了两个api分别对应hot、code signal,RxSwift仅有一个
- 错误处理,RAC相对容易一些
- UI Bindings,RAC有不少历史包袱,RxSwift则更容易使用
- Rx系列支持更多语言和平台
在接触 RAC 与 RxSwift 最明显的区别就是, RAC强调信号,还会细分为热信号、冷信号,而 RxSwift 强调可观测序列,其实也有冷热之分.
RAC 对冷信号和热信号的区别是很看重的,而 RxSwift 则不需要考虑是冷信号还是热信号(只能说没RAC那么重要,掌握每种序列的特征还是有必要的)
- 笔记: 序列和信号
目前来看学习使用 RxSwift 的价值远高于 Combine
- 功能更加丰富、完善
- 兼容更低版本
参考文章: RxSwift to Apple’s Combine “Cheat Sheet” & RxSwift to Combine Cheatsheet
这是一篇 RxSwift 作者对 Combine 和 RAC 的对比说明 RxSwift: Comparison with other libraries
FRP对比——ReactiveCocoa、RxSwift、Bacon以及背后的Functional
微软给的定义是,Rx 是一个函数库,让开发者可以利用可观察序列和LINQ风格查询操作符来编写异步和基于事件的程序,使用Rx,开发者可以用Observables表示异步数据流,用LINQ操作符查询异步数据流, 用Schedulers参数化异步数据流的并发处理,Rx可以这样定义:Rx = Observables + LINQ + Schedulers。
ReactiveX.io给的定义是,Rx是一个使用可观察数据流进行异步编程的编程接口,ReactiveX结合了观察者模式、迭代器模式和函数式编程的精华。
ReactiveX 不仅仅是一个编程接口,它是一种编程思想的突破,它影响了许多其它的程序库和框架以及编程语言