我正在尝试学习库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),因此不会重复获取数据。