ReactiveCocoa 与 RxSwift - 优缺点?

ReactiveCocoa vs RxSwift - pros and cons?

所以现在有了 swift,ReactiveCocoa 人们已经在 3.0 版中为 swift

重写了它

此外,还有另一个名为 RxSwift 的项目。

我想知道人们是否可以添加有关这两个框架的 design/api/philosophy 差异的信息(请本着 SO 的精神,坚持真实的事情,而不是关于 design/api/philosophy 的意见=28=])

[Whosebug mods 注意事项:这个问题确实有明确的答案,答案是两个框架之间的差异。我认为这也是 SO]

的热门话题

首先,我阅读他们的自述文件的初步印象是:

这是一个很好的问题。比较这两个世界是非常困难的。 Rx 是 Reactive Extensions 在其他语言(如 C#、Java 或 JS.

中的端口

Reactive Cocoa 受到 Functional Reactive Programming 的启发,但在过去几个月中,也被指出 受到 Reactive Extensions[= 的启发134=] 还有。结果是一个与 Rx 共享一些东西的框架,但名称起源于 FRP。

首先要说的是,根据Conal's definition的概念,RAC和RxSwift都不是Functional Reactive Programming实现。从这一点开始,一切都可以简化为每个框架如何处理副作用和其他一些组件。

让我们谈谈社区和 元技术 东西:

  • RAC 是一个已有 3 年历史的项目,诞生于 Objective-C,后来在完全放弃 Objective-C 上正在进行的工作后移植到 Swift(带桥接器)用于 3.0 版本。
  • RxSwift 是几个月前的项目,现在似乎在社区中势头强劲。对 RxSwift 来说重要的一件事是它在 ReactiveX 组织下并且所有其他实现都以相同的方式工作,学习如何处理 RxSwift 将使与Rx.Net、RxJava 或 RxJS 是一项简单的任务,只是语言语法的问题。我可以说这是基于哲学一次学习,到处应用

现在是时候介绍技术了。

Producing/Observing 实体

RAC 3.0 有 2 个主要实体,SignalSignalProducer,第一个发布事件而不管订阅者是否连接,第二个需要 start 才能实际拥有signals/events 制作。创建此设计是为了分离乏味的冷热可观察量概念,这一直是许多开发人员混淆的根源。这就是为什么 差异可以归结为它们如何管理副作用

在 Rx 中 Swift、SignalSignalProducer 转换为 Observable,这听起来可能令人困惑,但这两个实体在 Rx 世界中实际上是同一回事.在 RxSwift 中使用 Observables 的设计必须考虑到它们是热的还是冷的,这听起来可能是不必要的复杂性,但是一旦你理解了它们的工作原理(又一次 hot/cold/warm只是副作用,而 subscribing/observing) 它们可以被驯服。

在这两个世界中,订阅的概念基本相同,RAC 引入的一个小区别是 interruption 事件,即在发送完成事件之前处理 Signal . 回顾一下两者都有以下类型的事件:

  • Next,计算新的接收值
  • Error,计算错误并完成流,取消订阅所有观察者
  • Complete,将流标记为已完成取消订阅所有观察者

RAC 还具有 interrupted,当 Signal 在正确完成或出现错误之前被处理时发送。

手动写入

在 RAC 中,Signal/SignalProducer 是只读实体,无法从外部管理它们,Rx 中的 Observable 也是如此Swift .要将 Signal/SignalProducer 变成可写实体,您必须使用 pipe() 函数来 return 手动控制的项目。在 Rx space 上,这是一种名为 Subject 的不同类型。

如果 read/write 概念听起来很陌生,可以用 Future/Promise 做一个很好的类比。 Future 是只读占位符,如 Signal/SignalProducerObservable,另一方面,Promise 可以手动完成,例如pipe()Subject.

调度程序

这个实体在两个世界中非常相似,相同的概念,但 RAC 是串行的,而不是 RxSwift 还具有并发调度程序。

作文

组合是响应式编程的关键特征。组合流是这两个框架的本质,在 RxSwift 中它们也被称为 sequences

RxSwift 中的所有可观察实体都是 ObservableType 类型,因此我们使用相同的运算符组合 SubjectObservable 的实例,无需任何额外关注.

在 RAC space 上,SignalSignalProducer 是 2 个不同的实体,我们必须 liftSignalProducer 上才能组成使用 Signal 的实例生成。这两个实体有自己的操作符,所以当你需要混合东西时,你必须确保某个操作符可用,另一方面你忘记了 hot/cold observables。

关于这部分,Colin Eberhardt总结得很好:

Looking at the current API the signal operations are mainly focussed on the ‘next’ event, allowing you to transform values, skip, delay, combine and observe on different threads. Whereas the signal producer API is mostly concerned with the signal lifecycle events (completed, error), with operations including then, flatMap, takeUntil and catch.

额外

RAC还有ActionProperty的概念,前者是计算副作用的类型,主要与用户交互有关,后者在观察值时很有趣值更改时的任务。在 RxSwift 中,Action 再次转换为 Observable,这在 RxCocoa 中得到了很好的展示,iOS 和 [=173] 的 Rx 原语集成=]. RAC的Property在RxSwift中可以翻译成Variable(或BehaviourSubject)。

重要的是要理解 Property/Variable 是我们必须将命令式世界与反应式编程的声明性联系起来的方式,因此有时是与第三方打交道时的基本组成部分iOS/Mac space.

的库或核心功能

结论

RAC 和 RxSwift 是两个完全不同的野兽,前者在 Cocoa space 中有着悠久的历史和很多贡献者,后者相当年轻,但是依赖于已被证明在 Java、JS 或 .NET 等其他语言中有效的概念。哪个更好的决定取决于偏好。 RAC 表示 hot/cold observable 的分离是必要的,这是框架的核心特征,RxSwift 表示它们的统一比分离更好,同样只是关于副作用如何managed/performed。

RAC 3.0 似乎在分离 hot/cold 可观察对象的主要目标之上引入了一些意想不到的复杂性,例如中断的概念、在 2 个实体之间拆分运算符以及引入一些命令式行为,例如 start 开始产生信号。对于一些人来说,拥有这些东西可能是一件好事,甚至是杀手级的功能,而对于另一些人来说,它们可能只是不必要的,甚至是危险的。另一件要记住的事情是 RAC 正在努力尽可能地跟上 Cocoa 约定,所以如果你是一个有经验的 Cocoa Dev,你 应该 觉得使用它比使用 RxSwift.

更舒服 另一方面,

RxSwift 存在所有缺点,例如 hot/cold observables,但也有 Reactive Extensions 的优点。从 RxJS、RxJava 或 Rx.Net 移动到 RxSwift 是一件简单的事情,所有的概念都是一样的,所以这使得找到 material 很有趣,也许是一样的你现在面临的问题,已经被 RxJava 中的某个人解决了,考虑到平台,可以重新应用解决方案。

选哪个绝对是个人喜好的问题,从objective的角度是无法判断哪个更好的。唯一的方法是开火 Xcode 并尝试两者并选择一个感觉更舒服的工作。它们是相似概念的 2 个实现,试图实现相同的目标:简化软件开发。