【学习资料】iOS响应式编程:ReactiveCocoa vs RxSwift
发布时间:2016年03月02日 16:25分 来源:博为峰教育网采编 关键词:iOS响应式编程 | 上一篇 | 下一篇 |
内容来自stack overflow的一个回答:ReactiveCocoa vs RxSwift - pros and cons?
关于iOS 响应式编程,要直接比较这两个有点难。Rx是Reactive Extensions的一部分,其他语言像C#,Java和JS也有。Reactive Cocoa受Functional Reactive Programming(FRP)启发,但是在最近一段时间里,他们提到也受到Reactive Extensions的启发。最终结果就是一个从 Rx 借鉴了一些东西,但是有着源自FRP名声的一个框架。
第一点要说明的是无论是RAC还是Rx都不是真正意义上的Functional Reactive Programming。按照 What is (functional) reactive programming 里的回答对于FRP概念的定义。有了iOS响应式编程这个认识,我们就可以从两个框架如何处理subscribing/observing时的副作用(side effect)和一些其他的组件上两个方面来比较。
1.社区(community)
RAC是一个已经有着3年历史的项目,从Objective-C时期开始,后来从3.0开始支持了swift(可以通过bridge在OC下使用),接着就完全停止了在Objective-C上的维护。RxSwift项目的时间短一些只有几个月(作者写的时间是15年),但是社区似乎充满了动力。关于RxSwift有一件重要的事是项目是按照 ReactiveX这个组织的规定下开发的,并且所有其他语言的Rx项目也是一样。如果学会了如何使用RxSwift,再去学习Rx.Net, RxJava 或者 RxJS就是小菜一碟,只是语言语法上的差异。这真的就是learn once, apply everywhere.
2.技术实现(extra-tech)
一:Producing/Observing Entities
RAC 3.0主要有两个实体,signal 和 SignalProducer。第一个发布事件无论是否有绑定订阅者,后者要有一个信号或事件产生才会触发。这两个区别是为了区分冷信号和热信号,也使很多开发者困惑。这就是他们处理副作用的一大区别。
在RxSwift,signal 和 Signal Producer变成了 Observable,听起来有点困惑,但是这两个实体在Rx的世界里是同一个东西。在RxSwift里创建Observables不需要考虑是冷信号还是热信号,一旦你理解了他们的工作原理就很容易掌握。再次说明 冷/热(cold/hot/warm)信号就是当你subscribing/observing 产生的副作用。
对于订阅的概念两者基本是一样的。在RAC里有一点小的区别,RAC可以中断一个事件当信号被 disposed,即使在事件发送完成信号之前。总结一下两者都有的以下事件:
●Next
处理新收到的值
●Error
处理一个错误,结束整个流,对所有的观察者取消订阅
●Complete
标记整个流已经完成,取消所有观察者的订阅。另外RAC会在收到一个disposed Signal后中断,即使没有收到complete或者error。
二 : Manually Writing
在RAC中,Signal/SignalProducer都是只读的实体,他们不能从外部被改变,RxSwift中的Observable也是如此。如果要把Signal/SignalProducer改变成可以手动改写的实体,你只能通过调用pipe()函数返回一个可以改动的对象。在Rx中,这是一个不同的类型叫做Subject。
如果读/写这样的概念听起来不太明白,可以类比为未来/承诺(Future/Promise)。未来只是一个只读的占位符(A Future is a read-only placeholder),就像Signal/Signal Producer和Observable。另外一方面,对于未来的承诺确可以手动自由的实现,就像pipe()和Subject。