ReactiveCocoa学习笔记(一):ReactiveCocoa的前世今生

最近很长一段时间在研究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的核心思想是两点:集成式的异步编程和事件驱动的编程。

  • 集成式的异步编程(composing asynchronous):Rx将各种异步的逻辑统一集成到同一处代码,而不是分散在代码各处进行处理。这样使得代码逻辑更加集中和清晰。
  • 基于事件(event-based):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是很神似的,它们都是函数式的、响应式的框架(但都不是真正意义上的函数响应式,后续文章会讲到)。但是又有一些不同点:

  • ReactiveCocoa是一个有4年历史的框架,经历了很多大型项目的实践运用
  • RxSwift时间短一点。但是社区非常有活力。另外,由于RxSwift是Rx的正统家族成员,因此,在RxSwift、RxJava、RxJs等框架间迁移十分方便,可以说是「Learn once, apply everywhere」

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

  • ReactiveCocoa中的核心概念是两种信号:SignalSignal Producer,分别称为「冷信号」和「热信号」。ReactiveCocoa用这种概念的区分来处理副作用。
  • RxSwift则只有一个核心概念:Observable。因此,在创建一个Observable时,要仔细考虑它应当是「冷信号」还是「热信号」。同样,这也是为了处理副作用。

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

  • Next:新产生的值
  • Error:发送一个错误值,并终止该可观察集合(信号),移除对它的观察者
  • Complete:发送一个代表「完成」的值,并终止该可观察集合(信号),移除对它的观察者

但是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库现在被拆分成了四个库:

  • ReactiveCocoa:现如今的ReactiveCocoa库主要是作为UIKitAppKit的扩展,所做的更多是业务方面的工作。依赖于ReactiveSwift。
  • ReactiveSwift:ReactiveSwift是原来ReactiveCocoa库中拆分出来的只和Swift相关的核心库。这个库非常精简,且不依赖平台。ReactiveCocoa + ReactiveSwift可以用来完成CocoaCocoaTouch的开发, 而毕竟Swift已经是一门开源的语言,所以将ReactiveSwift分离出来以适用于其他平台的开发。
  • ReactiveObjC:这就是原来ReactiveCocoa库中Objective-C相关的部分。它和ReactiveSwift算是同胞兄弟的关系,一样的功能,两套API。
  • ReactiveObjcBridge:由于上述ReactiveObjc和ReactiveSwift的兄弟分家,于是就有了ReactiveObjcBridge这个桥接这两套API的库。它可用于一些老的项目从Objective-C向Swift转换,或是Objective-C和Swift混编的项目。

Reference

reactivex主页

reactivecocoa vs rxswift-pros and cons?

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

初探 ReactiveSwift

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,029评论 4 62
  • 先更新88位歌手合集, 全部都是百度云高速下载, iTunes Plus AAC和MP3都有,方便音乐爱好者收藏,...
    17ea5db600c6阅读 6,297评论 1 2
  • 善恶到头终有因, 凤毛麟角本空身, 何当绽破无生忍, 放下舟楫可度人。
    光觉阅读 110评论 0 0
  • 今日在招聘网站上看的时候看到了好些大学的同学。有些应该混的不错。而我是否这两三年被耽搁了呢。尽快做出决定吧。 今日...
    老虎屁股摸不得阅读 421评论 0 0
  • 借用武志红老师书的名字,是因为这两天,身体的感受与变化,切实地发生在我身上。 回忆鼓励咨询师课程上自己内心深处那个...
    晓行之阅读 519评论 0 51