ReactiveCocoa vs RxSwift – 优点和缺点?
因此,现在迅速, ReactiveCocoa人已经在3.0版中重写了它的swift
还有另外一个项目叫做RxSwift 。
我想知道人们是否可以增加关于这两个框架在devise/ api /哲学上的差异的信息(请按照SO的精神,坚持真实的事情,而不是关于哪个是最好的意见)
[StackOverflow mods注意:这个问题有确定的答案,答案是两个框架之间的差异。 我认为这也是在SO的话题高度]
要开始,阅读ReadMe的最初印象是:
- 作为一个熟悉微软“真正的”C#Rx的人,RxSwift看起来更容易识别。
- ReactiveCococa似乎已经进入了自己的空间,引入了诸如Signals vs SignalProducers和Lifting等新的抽象概念。 一方面,这似乎澄清了一些情况(什么是热vs冷信号),但另一方面,这似乎增加了框架的复杂性很多
这个问题问得好。 比较两个世界是非常困难的。 Rx是Reactive Extensions在其他语言如C#,Java或JS中的一个端口。
Reactive Cocoa灵感来源于function性反应式编程 ( ReactivePlatform) ,但在过去的几个月中,也被Reactive Extensions所启发 。 结果是一个框架,与Rx共享一些东西,但在FRP中有起源的名字。
首先要说的是,根据Conal对这个概念的定义 ,RAC和RxSwift都不是Functional Reactive Programming的实现。 从这一点,一切都可以简化为每个框架如何处理副作用和其他一些组件。
让我们来谈谈社区和元技术的东西:
- RAC是一个3年前的项目,出于Objective-C,后来完全放弃了目前正在进行的Objective-C工作,后来移植到3.0版本的Swift(有桥梁)。
- RxSwift是一个几个月前的项目,现在在社区似乎有一个势头。 对RxSwift来说重要的一件事就是在ReactiveX组织之下,所有其他的实现都以相同的方式工作,学习如何处理RxSwift将使Rx.Net,RxJava或RxJS成为一个简单的任务,只是一个问题的语法语法。 我可以说是基于一次哲学学习,到处应用 。
现在是时候了技术的东西。
生成/观察实体
RAC 3.0有两个主要的实体, Signal
和SignalProducer
,第一个发布事件,不pipe用户是否连接,第二个实体需要start
实际产生信号/事件。 这种devise是为了分离冷热观察的繁琐概念而devise的,这已成为许多开发人员的混淆之源。 这就是为什么差异可以减less到他们如何pipe理副作用 。
在RxSwift中, Signal
和SignalProducer
转化为Observable
,可能听起来令人困惑,但这两个实体在Rx世界中实际上是一样的。 RxSwift中的Observable
s的devise必须考虑到它们是否热或冷,这听起来可能是不必要的复杂性,但是一旦你明白了它们是如何工作的(再次热/冷/暖只是在订阅/观察)他们可以被驯服。
在这两个世界里,订阅的概念基本上是相同的,RAC引入了一个小的差别,并且是在发送完成事件之前处理Signal
时的interruption
事件。 回顾两者有以下几种事件:
-
Next
,计算新收到的值 -
Error
,要计算错误并完成stream,请取消订阅所有观察者 -
Complete
,将stream标记为已完成取消订阅所有观察者
此外,在完成正确或错误之前处理Signal
时,RAC还会interrupted
发送。
手工写作
在RAC中, Signal
/ SignalProducer
是只读实体,不能从外部进行pipe理,对于RxSwift中的Observable
也是一样。 要将Signal
/ SignalProducer
转换为可写入的实体,必须使用pipe()
函数返回手动控制的项目。 在Rx空间中,这是一种不同的称为Subject
types。
如果读/写概念听起来不熟悉,可以与Future
/ Promise
做一个很好的类比。 Future
是一个只读的占位符,如Signal
/ SignalProducer
和Observable
,另一方面, Promise
可以手动完成,就像pipe()
和Subject
。
调度程序
这个实体在两个世界中都是非常相似的,相同的概念,但是RAC只是串行的,而RxSwift的function也是并发调度器。
组成
组合是反应式编程的关键特征。 构成stream是两个框架的本质,在RxSwift中它们也被称为序列 。
RxSwift中的所有可观察实体都是ObservableType
types的,所以我们用相同的操作符构成了Subject
和Observable
实例,没有任何额外的关注。
在RAC空间中, Signal
和SignalProducer
是两个不同的实体,我们必须lift
SignalProducer
才能组成Signal
实例。 这两个实体有自己的操作员,所以当你需要混合的东西,你必须确保有一个操作员可用,另一方面,你忘了热/冷观察。
关于这部分, Colin Eberhardt很好地总结了这一点:
看看当前的API,信号操作主要集中在“下一个”事件上,允许您在不同的线程上转换值,跳过,延迟,合并和观察。 而信号产生者API主要关注信号生命周期事件(完成,错误),包括那些操作,flatMap,takeUntil和catch。
额外
RAC还有Action
和Property
的概念,前者是一种计算副作用的types,主要涉及用户交互,后者在值发生变化时观察值执行任务时很有意思。 在RxSwift中, Action
再次转换为Observable
,这在RxCocoa
很好地展示,这是iOS和Mac的Rx原语的集成。 RAC的Property
可以在RxSwift中翻译成Variable
(或BehaviourSubject
)。
理解Property
/ Variable
是我们必须将命令式世界与Reactive Programming的声明性本质联系起来的方式,因此有时在处理第三方库或iOS / Mac空间的核心function时是一个基本组成部分。
结论
RAC和RxSwift是两个完全不同的野兽,前者在Cocoa领域有很长的历史,还有很多贡献者,后者相当年轻,但依赖于已经被certificate在Java,JS或其他语言中有效的概念。净。 关于哪个更好的决定是优先select的。 RAC指出,热/冷可观察性的分离是必要的,这是框架的核心特征,RxSwift说,它们的统一比分离更好,同样也是副作用是如何pipe理/执行的。
RAC 3.0似乎已经引入了一些意想不到的复杂性,主要目的是分离热/冷可观测量,如中断的概念,在两个实体之间分离运算符,并引入一些必要的行为,如start
开始产生信号。 对于一些人来说,这些事情可能是一件好事,甚至是一个杀手的function,对于一些人来说,他们可能是不必要的,甚至是危险的。 另外要记住的是,RAC尽可能地跟上cocoa的习惯,所以如果你是一个经验丰富的cocoa开发者,你应该感觉到使用它而不是RxSwift更舒服。
另一方面,RxSwift生活在所有的不利因素中,比如热/冷的可观察性,还有Reactive Extensions的好处。 从RxJS,RxJava或Rx.Net移到RxSwift是一件简单的事情,所有的概念都是一样的,所以这使得find材料非常有趣,也许现在面临的同样的问题,已经被RxJava中的某个人解决了,解决scheme考虑到平台可以重新应用。
select哪一个肯定是一个偏好的问题,从客观的angular度来看是不可能的,哪一个更好。 唯一的办法就是启动Xcode并尝试两种方式,并select一个感觉更舒适的工作。 它们是类似概念的2个实现,试图达到相同的目标:简化软件开发。