frp - ShenYj/ShenYj.github.io GitHub Wiki

函数响应式编程

前言

FRP,全称为Functional Reactive Programming,是一种响应变化的编程范式

开始学习并使用 RxSwift 是在 2021年4月中旬,第一次了解函数响应式编程应该是2016年左右的事了,当时比较火的是 RAC。

在开始决定使用函数响应式编程框架时,我对它们几个方案并不是时分了解,RAC、ReactiveSwift、RxSwift,还有能搜索到的一些很接近的名称,对此我一时头大,因此也查阅了一些网文进一步了解对比,最终选择了 RxSwift 的方案

iOS函数响应式编程方案

iOS目前的响应式编程方案

  • ReactieCocoa(RAC)
  • RxSwift
  • Combine

ReactiveCocoa

ReactiveCocoa 是一个比较早的开源项目,从 Objective-C 时期开始
后来从 3.0 开始支持了 Swift (可以通过 bridge 在 Objective-C 下使用),接着就完全停止了在 Objective-C 上的维护
到了 5.0 更是将 RAC 拆分为四个库:ReactiveCocoa、ReactiveSwift、ReactiveObjC、ReactiveObjCBridge,用于区分 Objective-C 和 Swift 开发。

RxSwift

RxSwift 项目晚于 ReactiveCocoa。
RxSwift 是按照 ReactiveX 这个组织的规定下开发的,并且所有其他语言的 Rx 项目也是一样,只是语言语法上的差异,也就是说掌握了一门语言的 Rx 框架再去转换其他语言的 Rx 实现是很快的。

Combine

Combine 是苹果在 iOS 13.0 开始提供的一套框架,目前我对这个框架学习不多,在除此方案选型时,简单看了 RxSwift (还未开始深入学习使用,只是看了看 api)后再看了眼 Combine 后,直接扭头去学 RxSwift了,原因有两点

  • Combine 感觉就是 RxSwift的子集,功能还没完善就放出来了,一个早产儿
  • iOS 13.0 +

对比

RAC vs RxSwift

早前查阅资料了解了一些信息(目前整理凭借记忆、印象)

FRP 最早起源于微软,后被 RAC 团队借鉴并 基于 Object-C 开发了开源框架 RAC

ReactiveXReactive 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那么重要,掌握每种序列的特征还是有必要的)

Combine vs RxSwift

目前来看学习使用 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

ReactiveX

微软给的定义是,Rx 是一个函数库,让开发者可以利用可观察序列和LINQ风格查询操作符来编写异步和基于事件的程序,使用Rx,开发者可以用Observables表示异步数据流,用LINQ操作符查询异步数据流, 用Schedulers参数化异步数据流的并发处理,Rx可以这样定义:Rx = Observables + LINQ + Schedulers。

ReactiveX.io给的定义是,Rx是一个使用可观察数据流进行异步编程的编程接口,ReactiveX结合了观察者模式、迭代器模式和函数式编程的精华。

ReactiveX 不仅仅是一个编程接口,它是一种编程思想的突破,它影响了许多其它的程序库和框架以及编程语言

⚠️ **GitHub.com Fallback** ⚠️