如何在RxSwift中翻译if-else?

har*_*n78 7 reactive-programming swift rx-swift

我正在尝试学习库RxSwift

我有一些像这样的代码:

if data.checkAllIsOk()
{ 
    [do things]
}
else
{ 
    [show alert]
}
Run Code Online (Sandbox Code Playgroud)

现在我需要在检查之前更新服务器上的数据,因此我建模了一个返回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()
Run Code Online (Sandbox Code Playgroud)

它的工作原理(或它应该,我仍然在写它),但它感觉不对..是否有更"反应"的方式来做它?什么是最合适的运营商?

也许为"false"返回错误并使用catch块?

更新

按照ssrobbi建议的方法,我在2个不同的subscribeNext中拆分了2个分支,并使用过滤器来选择正或负分支.这是产生的代码:

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()
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是我可以只重用代码的其他部分中的两个分支中的一个,而无需重写订阅体(更少的重复总是好的!)

更新

在RxSwift松弛中进行了一些讨论后,我添加了shareReplay(1),因此不重复getData().

ssr*_*bbi 5

所以说实话我还在学习,现在我没有RxSwift在我面前(所以如果我正在喷射BS,有人会纠正我),但也许我可以带领你走向正确的方向.

您的解决方案确实有效,但正如您所说,它不是很"反应".我认为问题在于您的数据流设置方式必须对是否显示警报或执行操作做出必要的决定.应该发生的是,不是getData返回一个observable,而是getData应该获得它需要的任何数据(无论是来自网络,核心数据等),然后它应该更新一个可观察的属性.

对于做事: 现在,您将观察该属性,映射它以检查它是否正常,并像您一样订阅它,检查它是否真实,以及它是否正在做事情.(并添加一次性)

对于警报: 你做的完全相同,再次观察相同的属性,但检查相反的情况并做一些事情.


我认为对它没有超级反应的是你正在同步等待来自该getData()功能的响应,这会创建一个场景,你现在有状态,是否显示警报,还是做额外的工作.它们不是来自其他一些财产的价值流.显示警报和执行操作仅相互关联,因为您必须设置代码.

编辑:而不是使用if语句检查是否为真,也许你可以在订阅之前通过过滤器.