嘿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上关注我。