美文网首页iOS-RAC程序员iOS Developer
ReactiveCocoa 4 文档翻译:框架组成介绍

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

作者: 没故事的卓同学 | 来源:发表于2016-02-27 02:13 被阅读1730次

    原文: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不允许任务根据另一个调度器而改变顺序。

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/cxewkttx.html