征服ReactiveSwift:信号和观察者(第3部分)
大家好! 欢迎来到征服ReactiveSwift的第3部分。 在上一篇文章中,我们讨论了ReactiveSwift的各种原语。 在这一部分中,我们将讨论Signal ,它是Source类别下的一个重要原语。 本文将指导您完成创建信号并通过Observer进行观察的过程 。
信号
在函数式无功编程(FRP)中,我们将系统建模为时变函数。 这只是意味着我们定义了系统随着时间的流逝如何运行。 与命令式编程相反,在命令式编程中,我们在给定的时间点管理系统状态,而在FRP中,这里我们处理一段时间内状态的变化。 Signal的概念很好地体现了这种“随时间变化”的概念。 信号定义为事件流,其中每个事件代表给定时间点的系统状态。 事件 ( 信号的基本单位)可以是以下类型之一:
- 值 :任何类型的有效信息
- 失败 :指示流已完成,并显示错误
- 已完成 :指示流的成功结束,将不再发出其他事件
- 中断 :表示事件产生已被中断
信号继续发送“ 值 ”类型的事件流,直到遇到“ 失败/完成/中断 ”类型的事件。 一旦信号发出类型为“ Error / Completed / Interrupted ”的事件,它将停止发送任何值。
观察者
为了观察信号发出的事件,ReactiveSwift提供了一个称为Observer的原语。 观察者是围绕(Event) -> Void
类型的闭包的简单包装。 它封装了响应信号发出的事件的系统行为信息。 假设我们要观察一个发射整数值的信号 。 我们将定义一个观察者,如下所示:
让观察者= Signal .Observer {(event)in
切换事件{
案例让.value(v):
print(“ value = \(v)”)
案例让.failed(错误):
print(“错误= \(错误)”)
案例完成:
打印(“完成”)
案例.interrupted:
打印(“中断”)
}
}
现在,我们很清楚如何创建观察者,现在让我们学习如何创建和观察信号。
让我们从问题陈述开始。
每隔五秒打印一次时间信息,间隔五十秒。
在FRP中,我们根据时变函数对系统进行建模。 换句话说,我们需要从信号方面考虑。 对于此问题,我们需要一个Signal,该信号每五秒钟发出一个整数值。
为了实现这一点,让我们来个管道。
信号创建可以可视化为流经管道的水流。 使用者处理管道的接收端,而生产者在源端发送数据。
在ReactiveSwift中,信号创建如下:
在这里, 输出的类型为Signal , 输入的类型为Observer 。
input
用于将事件注入到output
。
现在,让我们向信号发送值。
信号准备就绪。 因此,让我们继续观察它。 为此,我们需要一个Observer实例。 在 在文档中, 观察者的定义如下:
观察者是函数的简单包装,该函数可以接收事件(通常从信号)。
信号的使用者必须定义一个闭合,该闭合封装了接收事件时要执行的动作。 在这里,我们需要一个闭包,它可以打印响应于我们先前创建的信号而time elapsed
。 让我们创建一个observer
。
让我们放在一起。
它是如何工作的?
当我们通过管道创建信号时,我们得到一个的元组。 输入 (类型Observer
)代表信号的所有订阅者。 当我们想发送事件信号时,我们调用input的 send(value:Value)
。 这将触发所有已订阅观察者的send
,并且将执行与观察者关联的闭包。
信号寿命:
在以下情况下,信号将不存在:
- 它收到一个终止事件
- 没有活动的观察者且信号未保留
观察寿命:
我们可以使用disposable
的原语和lifetime
来定义要收听信号多长时间。
替代观察方法:
ReactiveSwift还提供了以下观察Signal
类的方法。 这些有助于观察特定类型的事件。
- 观察值
- 观察失败
- 观察中断
- 观察完成
结论:
让我们回顾一下。 我们需要三个简单的步骤来创建一个信号并观察它:
- 拿烟斗
- 通过输入观察器发送值
- 通过输出观察器监听值
示例代码可以在这里找到。 在下一篇文章中,我们将介绍SignalProducers的概念。
谢谢您阅读😄