ReactiveCocoa-Swift部分入门指南-SignalProducer

448 查看

原文地址: 传送门简书只做同步更新功能


学习过ReactiCocoa(以下简称RAC)的同学一般都会使用Objective-C的部分,不过RAC3之后支持了Swift,目前RAC3.x支持的是Swift1.x系列,RAC4支持的是Swift2.x系列。今天花了一点时间学习了下Swift部分示例代码。这里做些记录。Swift是支持playground,可以使用Markdown编写文档,并且所见即所得的界面方便学习。更可以插入图片。方便阅读。

学习知识必备

默认你已经学过RAC-OC部分, Swift语言,并对Monad,functional Programming有些简单的了解,或者,如果你学习了RXSwift更好。

Start

PlaygroundUtility

先来观察一下这个里面有两个方法

scopedExample 方便测试,并分割日志输出,Error也是为了测试方便。

SignalProducer

一个信号发生器,是SignalProducer类型的实例,它可以创建信号(signals)并施加附作用(side effects)。

信号发生器用来表示操作或者任务,比如网络请求,每一次对它调用start()将会生成一个新的潜在操作,并允许调用者观察它的结果。还有一个startWithSignal()方法,会给出产生的信号,允许在必要的情况下被监听多次。

根据start()方法的动作方式,被同一个信号发生器生成的信号可能会有不同的事件顺序或版本,甚至事件流完全不一样!和普通的信号不同,在观察者连接上之前,信号发生器不会开始工作(也就没有事件会生成),并且在每一个新的监听器连接上时其工作都会重新开始一个单独的工作流

启动一个信号发生器会返回一个销毁器(disposable,我也不知道怎么翻译合适),它可用来打断或取消被生成信号的工作。

和信号一样,信号生成器可以通过map、filter等原函数操作。使用lift方法,所有信号的原函数可以被提升成为以信号生成器为对象的操作。除此以外,还有一些用来控制何时与如何启动信号生成器的原函数,比如times。

补充,这段我是参考自ReactiveCocoa 4 图解之六——信号发生器(SignalProducer),不过我觉得说的相当之晦涩,在学习这部份的时候,我已经学习了,RAC-OC部分,RXSwift,冷热信号等概念。突然出了一个SignalProducer的概念会让读者很难理解,其实很容易就发现,SignalProducer会带来附作用(冷信号),Signal不会带来副作用(热信号),那他们就很好理解了,SignalProducer类似RACOC中的RACDynamicSignal,Signal类似RACSubject。
通过lift函数可以让热信号转变为冷信号。
如果想学习Signal部分参考文章底部链接

Subscription

一个信号生成器代表了一种可以在需要的时候才被启动的操作(不像Signal是自启动的),这种信号是冷信号,在刚开始这个信号的状态也为冷(未激活), 既然是冷信号,那么就意味这一个观察者不会错过任何被信号生成器发出的值。

补充: 像signal 是创建的时候状态为cold(理解为未激活) ,被订阅时状态为hot (理解为激活)。
但是冷信号和热信号与状态为冷热是两个不同的概念。冷信号会带来附作用,热信号不会
这里我把副作用(side effect) 理解为附作用,有时候这是一个很必要的附加操作,并不一定都是无益的,不然就没有存在的价值了。
如果读者觉得理解的不对,请指出后续会继续修改。

像不像是RACDynamicSignal的创建方式,这不过不同与Sinal的是 这里的发送信号的观察者是在内部通过 Signal.pipe() 生成的,不需要外部创建。
SignalProduce是冷信号,任何一个订阅者/观察者都不会错过任何事件
start方法类似与Signal的 signal.observe()方法,只不过Signal的方法只有一个作用,就是关联一个观察者,而SignalProduce的start方法还多了一个激活信号的功能。

Empty

一个会立即调用complete事件的信号生成器