不可观察序列就是我们通常所说的可枚举对象(或集合)实现IEnumerable接口并返回一个实现Enumerator接口的迭代器。当使用枚举时,通常使用循环将值从集合中取出。Rx可观察对象的行为不同:不是拉动,而是值被推送到观察者。表1.1和1.2显示了拉和推的情况模型相互对应。这两者之间的关系被称为对偶原理。(注:这里的二象性有一个例外,因为GetEnumerator参数的孪生参数(它是void)应该是转换为Subscribe方法返回类型(并保持为空),但使用的是IDisposable。)
表1.1 IEnumerator和IObserver如何相互对应
表1.2 IEnumerable和IOobservable如何相互对应
可观察对象和观察者填补了.NET在处理异步时的空白,在推送模型中需要返回一系列值的操作(push每个序列中的项)。与异步提供单个值的Task不同,或IEnumerable,提供多个值,但在同步拉取模型中,可观察对象异步发出一系列值。表1.3对此进行了总结。
表1.3推送模型和拉取模型数据类型
由于可观察对象和可枚举对象之间存在反向对应关系(对偶性),因此可以从值序列的一种表示转换为另一种表示的固定集合,例如List,可以转换为一个可观察对象,通过将其所有值推入观察器来推出它们。更令人惊讶的事实是,可观察对象可以转换为基于拉取模型的集合。在后面的章节中您将深入了解如何使用这些细节进行这些转换。现在,最重要的事情是,因为您可以将一种模型转换为另一种模型,所以您可以使用基于拉取模型完成的所有操作也可以使用基于推送模型完成。因此,当你面对一个问题时,你可以用最简单的模型来解决它,然后在需要时转换结果。
我在这里要说明的最后一点是,由于您可以将单个值视为一个项目的集合,因此您可以按照相同的逻辑将异步单个项目(Task)视为一个项目的可观察对象,反之亦然。记住这一点,因为这是理解“一切都是可观察的”的重要一点。
——未完待续
译者:重庆教主 2024.05.14
网站:WPF中文网 wpfsoft.com