gpt4 book ai didi

swift - 如何在 RxSwift 中翻译 if-else?

转载 作者:搜寻专家 更新时间:2023-10-30 22:06:58 24 4
gpt4 key购买 nike

我正在努力学习图书馆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()

它有效(或者它应该有效,我还在写它),但感觉不对.. 是否有更“ react 性”的方式来做到这一点?最适合使用的运算符是什么?

也许返回“false”错误并使用 catch block ?

更新

按照 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()。

最佳答案

所以老实说,我也在学习,现在我面前没有 RxSwift(所以如果我胡说八道,请有人纠正我),但也许我可以带你进入正确的方向。

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

对于做事:现在,您将观察该属性,将其映射以检查它是否正常,然后像您所做的那样订阅它,检查它是否为真,以及它是否正在执行操作。 (并添加一次性)

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


我认为它不是 super react 的是你正在同步等待来自 getData() 函数的响应,它创建了一个你现在有状态的场景,是否显示警报,或者做额外的工作。它们不是从其他一些属性(property)的值(value)流中衍生出来的。显示警报和执行操作仅相互关联,因为您命令式地设置了代码。

编辑:与其使用 if 语句检查是否为真,不如在订阅之前通过过滤器进行筛选。

关于swift - 如何在 RxSwift 中翻译 if-else?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32358929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com