阅读(3976) (0)

ReactiveCocoa的另外一种流:信号

2017-07-31 17:02:23 更新

本篇我们介绍ReactiveCocoa的另一种类型的流,即信号。信号是push-driven的,这点与序列流正好相反,新值虽然能够通过管道进行发布却不能像pull-driven一样在管道中获取,它们所抽象出来的数据只会在以后的某个时间进行传送。

这里需要理解两个概念:pull-drivenpush-driven.

Push-driven means that values for the signal are not defined at the moment of signal creation and may become available at a later time (for example, as a result from network request, or any user input).

Push-driven : 在创建信号的时候,信号不会被立即赋值,之后才会被赋值(举个栗子:网络请求回来的结果或者是任意的用户输入的结果)

Pull-driven means that values in the sequence are defined at the moment of signal creation and we can query values from the stream one-by-one.

Pull-driven : 在创建信号的同时序列中的值就会被确定下来,我们可以从流中一个个地查询值。

信号发送三种类型的值:Next Values代表了下一个发送到管道内的值。Error Value代表signal无法成功完成,一般很少见,我们会在下一章学习怎么使用她们。Completion Values代表signal成功完成,我们也会在下一章来学习。这里要注意的是:

一个事情响应中,一个signal(信号)发送了一个Error value或者一个Completion Value后,就不会再发送任何其他的value. 错误或者成功将只会发送其中一个,绝不会有两个同时发送的情况!

信号是ReactiveCocoa的核心组件之一。ReactiveCocoa为UIKit的每一个控件内置了一套信号选择器。例如,UITextField就有一个rac_textSignal,UITextField中每一次按键的响应都会通过它发送出去。下一章我们会学习如何使用信号来执行任务。

ClassDiagram

信号也可以被链接(链式调用)和转化。通过映射或者过滤一个流得到的新的流也可以随后被映射、被过滤,进行所有你能想到的各种操作。在下一章中我们会更多的介绍这方面的内容。