征服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 ,并且将执行与观察者关联的闭包。

信号寿命:

在以下情况下,信号将不存在:

  1. 它收到一个终止事件
  2. 没有活动的观察者且信号未保留

观察寿命:

我们可以使用disposable的原语和lifetime来定义要收听信号多长时间。

替代观察方法:

ReactiveSwift还提供了以下观察Signal类的方法。 这些有助于观察特定类型的事件。

  1. 观察值
  2. 观察失败
  3. 观察中断
  4. 观察完成

结论:

让我们回顾一下。 我们需要三个简单的步骤来创建一个信号并观察它:

  1. 拿烟斗
  2. 通过输入观察器发送值
  3. 通过输出观察器监听值

示例代码可以在这里找到。 在下一篇文章中,我们将介绍SignalProducers的概念。

谢谢您阅读😄