Swift中的反应式编程可提供更具可读性的代码

响应式编程是定义响应异步事件的应用程序行为的有用工具。 它将异步操作处理代码从iOS中常见的委托模式转移到更具声明性的形式,使异步性更易于推理。 我没有使用响应式框架从头开始构建应用程序的经验,但是随着我逐渐增加对所涉及概念的理解,我发现在很多情况下,大量的响应式编程已使工作变得更加整洁。更具可读性的代码。 我一直在使用的框架是RxSwift,它是ReactiveX API的Swift实现,但是还有其他可用选项。 在本文中,我们将简要地探讨一个示例,该示例演示如何使用RxSwift创建一个可观察的序列来替换原本会分散在多个不同回调中的代码。

对于我们的示例,要求如下所示,我们必须显示一个垂直滚动的项目列表,每个项目都有一个要显示的图像,该图像必须通过网络异步加载。 我们不能简单地同时从网络中获取所有图像,因为我们的列表可能很长,并且用户甚至可能没有浏览到最后,因此最终可能会因不必要的网络调用而浪费能量和数据。 另一个限制是,当设备连接到wifi时,我们希望浏览的行为不同于连接到蜂窝网络时的行为。 当连接到wifi时,我们希望在用户滚动之前加载图像,以便在屏幕上滚动显示单元时就可以显示图像了。 当连接到蜂窝网络时,我们只希望在用户停止滚动时加载图像,以防止在滚动列表时使用过多的数据。

为了实现此行为,我们需要遵循几种协议,它们是UITableViewDelegateUITableViewDataSourcePrefetchingUIScrollViewDelegate 。 下面的代码给出了在视图控制器中外观的想法。

考虑到我们需求的复杂性,这并不是一个不好的结果,尽管它确实使我们一眼就很难看出图像加载行为是如何工作的,而且如果这些回调分散在一个大文件中(或几个文件)。 另一个复杂的因素是,这些委托回调通常还需要执行其他功能,这在阅读和理解图像获取行为时会产生更大的背景噪音。

反应式编程如何提供帮助?

我们可以使用反应式编程来定义可观察的事件流,这些事件驱动我们的loadImagesIfNecessary(for:)函数。 每当我们要加载一组图像时,此可观察对象将发出一个由索引路径数组组成的事件。 我们将通过组合和转换与我们感兴趣的委托回调相对应的可观察变量来构造此可观察变量(这些可观察变量在RxSwift的子组件RxCocoa中实现)。 以下是我们如何设置和使用此事件序列的示例。

从功能上讲,这应该与我们最初探讨的传统委托回调实现相同,但是,我认为它使我们的代码更易于理解,因为我们现在可以在一处读取所有图像提取逻辑,而背景噪音却更少。


这是我发现应用简单的反应式编程模式以便组合在一起并简化代码中的复杂逻辑的一种方法。 它确实要求读者对反应式编程原理有基本的了解,并向代码引入了第三方依赖性(反应式编程框架,在此示例中为RxSwift)。 您如何看待这种方法? 以这种方式进行逻辑合并值得额外的开销吗? 如果您有任何建议或问题,请给我@RowbotNZ发消息!