ReactiveCocoa学习笔记(一):ReactiveCoc

2017-10-30  本文已影响359人  阳仔dynamics

最近很长一段时间在研究ReactiveCocoa这个框架,因此将会写一系列的文章来记录和总结一下学习过程中的心得体会。本文是这个系列的第一篇,主要介绍了ReactiveCocoa的诞生背景和发展,以及现在的版本情况。

就像公司招聘员工工作之前,都要从简历来了解员工前面的学习、工作经历一样。我们在深入了解ReactiveCocoa这个强有力的工具之前,也有必要来了解一下它的前世今生,这也有助于更好理解它的核心思想和工作方式。

从Reactive Extensions说起

C#3.0中引入了Language Integrated Query(LINQ)这种语言特性。LINQ是对.NET的一个扩展,提供了统一的语法来从不同数据源中查询和提取数据。它的函数性和声明式语法使得我们的处理逻辑变得简单清晰。

Reactive Extension(Rx)是对LINQ的一种扩展,起源于Microsoft DevLabs的研究。它主要提供了一种组织和协调异步事件的方式。如果说LINQ专注的是处理静态集合数据,那么Rx处理的就是异步获得的集合数据。LINQ面对的是“现在”的数据,则Rx是定义了如何去处理“未来”的数据(例如将从服务器返回的数据)的方式。

Rx的核心思想是两点:集成式的异步编程和事件驱动的编程。

Rx使用一种可观察集合(Observable Sequence)来实现上述功能。可观察集合是Rx的核心,它是代表未来的值/事件的一个集合。我们声明了异步处理这些值的方式,这样当未来的值被添加到集合中的时候,我们便能够观察到(接收到)这些值并进行处理。

RxSwift和ReactiveCocoa

Rx是一个很大的家族,号称「ReactiveX is everywhere, and it's meant for everything」。各大主流编程语言中都有它的身影,比如Java的RxJava,JavaScript的RxJS,C++的RxCpp等。从前端到后端,Rx家族都有很大的舞台。对于移动端iOS开发来说,也有这么一个大家族的成员——Swift的RxSwift

是的,RxSwift才是Rx家族的正统血统。那么,我们的主角ReactiveCocoa和它有什么关系呢?

并没有什么关系(手动滑稽)。

ReactiveCocoa是一个Cocoa的扩展框架,它是Justin Spahr-SummersJosh Abernathy在开发GitHub for Mac的过程中的副产物。ReactiveCocoa受Functional Reactive Programming(FRP)的启发,但是最近他们提到也受到过Rx的启发。因此,可以说ReactiveCocoa是借鉴了一些Rx的精神,源自于FRP的一个框架。这两者是同一编程思想的两种不同实现。

RxSwift和ReactiveCocoa是很神似的,它们都是函数式的、响应式的框架(但都不是真正意义上的函数响应式,后续文章会讲到)。但是又有一些不同点:

此外,两者还有一些技术实现上的差别,这主要体现在他们是如何处理「副作用」的。关于副作用(Side-Effect),在后续的博文中会详细介绍,这里只需要理解成在创建一个可观察集合(ReactiveCocoa中为信号),以及对其进行观察时对该集合外部代码产生的影响:

另外,尽管RxSwift和ReactiveCocoa对事件的定义都是类似的,都有三种类型的事件:

但是ReactiveCocoa中,当一个信号在正常结束前(发送一个Error或者Complete)就被销毁了,还会发送另外一种称为Interruption的值。

除此之外,尽管还有一些细小的差别,但是RxSwift和ReactiveCocoa的用法和原理基本都是类似的。

项目中该如何选择?

在挑选去使用其中一个的时候,可以想想对于上述两个框架对「冷信号」和「热信号」的差别处理,你更接受哪个。

此外,ReactiveCocoa一直在不断更新,以更适合开发者对Cocoa框架的使用习惯。因此,如果你对Cocoa框架的开发很有经验,应当会更容易上手ReactiveCocoa这个框架;相反,如果你之前熟悉Reactive Extension,例如RxJava,RxJs,Rx.Net等等,那么你会对RxSwift更加得心应手。

ReactiveCocoa的2.5.0版本及以下为Objective-C版本,3.0.0版本以上到最新的发布版本6.0.0为Swift版本,现在支持到Swift 3.0.x。此外,原来的ReactiveCocoa库现在被拆分成了四个库:


Reference

reactivex主页

reactivecocoa vs rxswift-pros and cons?

ReactiveCocoa v2.5 源码解析之架构总览

初探 ReactiveSwift

上一篇下一篇

猜你喜欢

热点阅读