收藏本站
51Code Android开发培训Banner
您所在的位置:51Code首页 > 资料精选 > 学习资料 > 【学习资料】iOS响应式编程:ReactiveCocoa vs RxSwift

【学习资料】iOS响应式编程:ReactiveCocoa vs RxSwift

    发布时间:2016年03月02日 16:25分    来源:51Code采编    关键词:iOS响应式编程       | 上一篇 | 下一篇 |


 

iOS响应式编程:ReactiveCocoa vs RxSwift

 

       内容来自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。