
这里,我们还有一点值得注意。那就是可观察序列其实有两种类型。
有限观察序列( Finite observable sequences )
该序列是指那些最后会以 completed 或者 error 事件终极生命周期的可观察对象。最典型的例子就是,通过 API 进行网络请求:
开始数据请求并准备进行数据接收。 接收到服务端响应开始接收数据。 如果服务器或者网络发生故障则关闭请求并触发错误处理。 如果一切正常则对请求数据进行处理和分析。下面是一个文件下载请求的 Rx 范式的代码:
API.download(file: "http://www.easck.com/pre>
这段代码中 API.download (file:) 函数会创建一个 Observable<Data> 实例对象,并且在整个数据接收过程中会不断的触发 next 事件。然后,我们在 next 事件中会将这些片段数据保存到临时文件中。如果此过程出现错误的话,我们会将错误信息展示给用户。如果一切顺利我们会将临时文件保存到设备中。最后在下载完成后,我们可以在 completed 进行下一步的逻辑处理。
无限观察序列( Infinite observable sequences )
与网络任务不同的是,UI 以及交互事件是无限观察序列。它们并不存在一个明确的生命周期终结点。例如,针对可能的设备方向旋转,我们需要实时进行布局修改。而设备的方向旋转本身是随机发生的并且与应用本身具有同样的生命周期。因此 Rx 也需要一种机制支持这种无限观察序列。
针对这种情况,在 RxSwift 中我们可以通过以下代码来应对:
UIDevice.rx.orientation.subscribe(onNext: { current in
switch current {
case .landscape:
re-arrange UI for landscape
case .portrait:
re-arrange UI for portrait
}
})
操作符
ObservableType 以及 Observable 类的实现中都包含大量的异步处理方法,这些方法也被称为操作符。由于这些操作符只是进行异步输入处理并产生对应输出,所以它并不会对应用产生多余的副作用。另外,因为操作符之间的高度解耦所以我们很容易对它进行组合以期实现复杂的功能。
例如,对于上面的设备方向旋转,我们可以对所有的情况进行过滤然后对部分值进行进一步处理。
UIDevice.rx.orientation
.filter { value in
return value != .landscape
}
.map { _ in
return "Portrait is the best!"
}
.subscribe( onNext: { string in
showAlert(text: string)
})
上面的代码中,我们首先会将所有 .landscape 方向过滤掉不做任何处理。然后,我们再将剩下的 portrait 转化为字符串 Portrait is the best! 。整个处理流程大致如下:








