嘿RxSwift Observable,您要加载吗?

有时您会知道给定的操作将花费一些时间,它可能是网络呼叫(尤其是在移动网络中,网络状况很差),处理繁重的图像,甚至是通过Core Location获取用户的位置。

在那种情况下,大多数时候,需要在屏幕上的某个位置显示加载程序。

设计如何在命令式编程世界中显示加载程序很容易:

但是,如果我们尝试遵循反应式编程的理念,情况可能会有所不同:

您将如何创建一个Observable ,它仅在使用getMe()函数时在网络请求进行时发出true ,而在网络请求完成时发出false

Dø方法

第一种幼稚的方法是使用.do()运算符,然后侵入自己的方式来构建所需的Observable流。

由于它正在修改外部资源的状态(此处为rx_isLoading ),因此.do()运算符具有副作用。 它工作得很好,但是摆脱副作用并继续使用纯流会更好吗? 是的,它将!

最近,我考虑过如何避免Dø方法带来的任何副作用。

我最终写了一个扩展程序,该扩展程序将monitorLoading()函数添加到任何ObservableType 。 有了它,开发人员可以通过调用以下命令来计算3种不同的流:

  • .data()返回返回操作最终结果的流。
  • .loading()以返回发出Bool的流,以了解操作是否加载。
  • .error()返回操作失败时发出Error的流。

结果是优雅的,并且易于使用:

从那里,它很容易知道请求何时加载,使您能够根据需要显示或隐藏加载器:

另外,该扩展提供了一个API,以防网络调用失败并出现错误。 通过对.monitorLoading()的结果调用.error()可以访问它。

我不会花时间在.monitorLoading()扩展的实现细节上,但是这里是结果,可以随时使用和改进!


谢谢阅读! 如果您喜欢阅读的内容,请随时分享或发表评论。 您也可以在Twitter上关注我。