我正在尝试学习库RxSwift
我有一些这样的代码:
if data.checkAllIsOk()
{
[do things]
}
else
{
[show alert]
}
现在我需要在检查之前从服务器更新数据,所以我建模了一个返回 Observable 的 getData()。
我目前的做法是这样的:
getData()
>- flatMap{ (data:Data) -> Observable<Bool> in
_=0 // workaround for type inference bugs
return just(data.checkAllIsOk())
}
>- subscribeNext{ (ok) -> Void in
if ok
{
[do the things]
}
else
{
[show the alert]
}
}
>- disposeBag.addDisposable()
它有效(或者应该,我还在写它),但感觉不对..有没有更“反应性”的方式来做到这一点?最适合使用的运算符是什么?
也许返回“false”错误并使用 catch 块?
更新
按照 ssrobbi 建议的方法,我将 2 个分支拆分为 2 个不同的 subscribeNext,并使用过滤器来选择正分支或负分支。这是产生的代码:
let checkData=getData()
>- flatMap{ (data:Data) -> Observable<Bool> in
_=0
return just(data.checkAllIsOk())
}
>- shareReplay(1)
}
[...]
checkData
>- filter{ (ok) -> Bool in
ok == true
}
>- subscribeNext{ (_) -> Void in
[do the things]
}
>- disposeBag.addDisposable()
checkData
>- filter{ (ok) -> Bool in
ok == false
}
>- subscribeNext{ (_) -> Void in
[show the alert]
}
>- disposeBag.addDisposable()
这种方法的优点是我可以在代码的其他部分中仅重用两个分支中的一个,而无需重写订阅主体(减少重复总是好的!)
更新
在 RxSwift slack 中进行了一些讨论后,我添加了 shareReplay(1),因此不再重复 getData()。