ReactiveCocoa 4 文档翻译:框架组成介绍

原文:Framework Overview

我翻译的RAC4的文档
ReactiveCocoa 4 官方文档翻译
ReactiveCocoa 4 文档翻译:基本操作符(一)
ReactiveCocoa 4 文档翻译:基本操作符(二)
ReactiveCocoa 4 文档翻译:框架组成介绍
ReactiveCocoa 4 文档翻译:兼容Objective-C
ReactiveCocoa 4 文档翻译--设计指南(一):事件的规范
ReactiveCocoa 4 文档翻译:设计指南(二):信号的规范
[翻译]ReactiveCocoa 4 最佳实践

本文将以整个框架的高度介绍RAC框架中的主要组成元素,尝试说明它们是怎么组成在一起工作和各自的职责。这会有助于你学习新模块和查找相关详细说明的文档。
关于RAC的例子和应该怎么使用可以查看这两个文档:ReactiveCocoa 4 官方文档翻译:ReadMe 或者 Design Guidelines

事件:Events

一个事件, 用<code> Event </code>类型表示, 表示某些事情已经发生。 在RAC中事件是传播(center-piece of communication)的核心。 一个事件可能是button的一次点击,从API返回的一些信息,一个错误的发生,或者一个长时间操作完成了。无论如何,一些东西产生事件,然后通过signal发送给每个订阅这个signal的观察者。

<code> Event </code>是一个枚举类型,可能有四种值(Next中有值,其他三种表示结束):

  • <code> Next </code>代表有一个新的值从源产生。
  • <code> Failed </code>说明在信号源完成前发生了一个错误。事件会被当做一个类型为<code> ErrorType </code>的参数,一种在事件中声明过的表示已知错误的类型。如果这个错误没有被声明许可过,可以用<code> NoError </code>表示。
  • <code> Completed </code>说明事件已经成功结束。不会再有值发送出来。
  • <code> Interrupted </code>说明事件被取消了,意味着操作既没有成功也没有失败。

信号:Signals

一个信号, 用 <code> Signal </code>类型表示,是一连串随着时间发出的可以被观察的事件。

信号通常用来表示事件流正在发出,比如通知,用户的输入等。每当动作被执行或者数据已经接受,事件们就会通过signal发出,signal会把它们推送给每个观察者。所有的观察者都会同时接受到事件。

用户如果想要接收它们的事件必须observe(观察)这个signal。观察一个信号不会触发其他副作用。换句话说,事件是源驱动,基于推送,观察者在整个生命周期里不会受到到任何影响。当观察一个信号时,用户只能按照顺序处理信号里的事件。不能随意访问信号里的事件。

信号可以被操作符操作。常用的操作一个信号的有filter,map和reduce,zip可以一次处理多个信号源。操作符只能在Next事件中才能使用。(具体操作符可以参考我翻的这篇:ReactiveCocoa 4 文档翻译:基本操作符

信号的整个生命周期有一组Next事件组成,最后是一个终结事件,可能是Failed, Completed, 或者Interrupted中的任一个。终结事件没有被包含在事件的值里,他们需要被单独处理。

管道:Pipes

一个管道,通过 <code>Signal.pipe()</code>创建。一个可以被手动控制的信号。
这个方法返回一个信号和一个observer。可以控制信号发送事件给观察者。这个在将非RAC的代码转变到信号世界里特别有用。

比如,可以不用在block的回调里处理业务逻辑,将blocks简化成发送事件给观察者。同时信号可以被返回,隐藏回调里的具体实现。

信号生产者:Signal Producers

一个信号生产者,以 <code> SignalProducer </code>类型表示,创建信号并且产生副作用。

可以用来表示一组操作或者任务,比如网络请求,每次<code> start()</code>调用后会创建一个新的操作,允许发起者观察结果。通过<code> startWithSignal()</code>可以访问到产生的信号,允许被多次观察。

因为<code> start()</code>这种行为的不同,每次从同一个信号生产者可能会得到不同顺序或者版本的事件,甚至整个流可能完全不同。不像一个普通的信号,直到有一个观察者被添加才会开始启动,每次都会为新添加的观察者重新工作一次。

开启一个信号生产者会返回一个<code> disposable </code>,用了中断或者取消(interrupt/cancel)这个信号生产者的工作。
和信号一样,信号生产者可以被操作符比如map,filter等操作。每个信号的操作符都可以通过“lifted”迁移后在信号生产者上使用。而且,还有几个特有的操作符用了控制工作什么时候开始和怎么运行,比如<code> times </code>。

缓冲:Buffers

一个缓冲通过 <code> SignalProducer.buffer() </code> 创建,是一个事件的队列(通常指定数量),当新信号产生时,会重新执行队列里的事件。

和<code> pipe </code>相似,这个方法返回一个观察者。每个发给这个观察者的事件会被加入队列。如果这个缓冲区已经达到创建时预定的数量,当新的事件发来时,最早的一个会被移出队列。

观察者:Observers

<code> Observer </code>是指任何等待从信号中接收事件的东西。

Observers可以通过<code> Signal.observe </code>或者<code> SignalProducer.start</code>隐式获得。

动作:Actions

动作用 <code> Action </code>类型表示,指当有输入时会做一些工作。当动作执行时,会有0个或者多个值输出;或者会产生一个失败。

Action用来处理用户交互时做一些处理很方便,比如当一个按钮点击时这种动作。Action也可以和一个属性自动关联disabled。比如当一个UI控件的关联Action被设置成disabled时,这个控件也会disabled。

为了和NSControl和UIControl交互,RAC提供了<code> CocoaAction </code>类型可以桥接到OC下使用

属性:Properties

一个属性表现为<code> PropertyType </code>协议(protocol), 保存一个值,并且会将将来每次值的变化通知给观察者们。

property的当前值可以通过获取<code> value </code>获得。<code> producer </code>返回一个会一直发送值变化信号生成者(signal producer ),

<code> <~ </code>运算符是提供了几种不同的绑定属性的方式。注意这里绑定的属性必须是<code> MutablePropertyType </code>类型的。

  • <code> property <~ signal </code> 将一个属性和信号绑定在一起,属性的值会根据信号送过来的值刷新。
  • <code> property <~ producer </code> 会启动这个producer,并且属性的值也会随着这个产生的信号送过来的值刷新。
  • <code> property <~ otherProperty </code>将一个属性和另一个属性绑定在一起,这样这个属性的值会随着源属性的值变化而变化。

<code> DynamicProperty </code> 类型用于桥接OC的要求KVC或者KVO的API,比如<code> NSOperation </code>。要提醒的是大部分AppKit和UIKit的属性都不支持KVO,所以要观察它们值的变化需要通过其他的机制。相比<code> DynamicProperty </code>要优先使用 <code> MutablePropertyType </code>类型。

销毁:Disposables

disposable表现为<code> Disposable </code> 协议,用于内存管理和释放销毁。

当你启动一个signal producer,一个disposable会被返回。可以用于被调起者取消已经启动的signal producer(比如后台线程的处理,网络请求等),清除临时资源,发送一个最终的<code> Interrupted </code>事件给它创建的信号。

观察一个信号也会返回一个disposable。调用后就不会再收到这个信号发过来变化的值,但是这对信号本身不会产生影响。

更多关于销毁的信息查看这份文档:RAC Design Guidelines.

调度器:Schedulers

调度器,类型是<code> SchedulerType </code> 协议, 是一个序列化的要被执行的任务队列或者是一组向外输出的结果。

信号和信号生成者可以按照安排好的次序发送事件到一个指定的 scheduler。信号生产者还可以在指定的调度器上被启动。

scheduler很像GCD,但是scheduler可以被销毁(通过Disposable),而且总是连续执行。由于 ImmediateScheduler
会引发异常, scheduler不提供同步的操作。这样可以避免出现死锁,还鼓励使用信号的操作符而不是blocking work。
scheduler也有点像<code>NSOperationQueue</code>, 但是scheduler不允许任务根据另一个调度器而改变顺序。

欢迎关注我的微博:@没故事的卓同学

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

推荐阅读更多精彩内容