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了,原因有两点

对比

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** ⚠️