【问题标题】:RxSwift: Convert Observable to a VariableRxSwift:将 Observable 转换为变量
【发布时间】:2018-05-27 10:42:52
【问题描述】:

如何将 Int 类型的 Observable 转换为 Int 类型的变量?

这是我迄今为止尝试过的:

let obs: Observable<Int> = Observable.of(4)

let variable: Variable<Int> = obs
    .flatMap { num in
        return Variable<Int>(num)
    }

使用 flatMap 感觉是进行转换的最合乎逻辑的方式,但是,我得到一个编译器错误,它本质上说它不喜欢 flatMap 返回任何不可观察的东西。有什么想法吗?

编辑:

只是为了说明为什么我需要将 Observable 转换为变量:

我需要我的 viewModel 来驱动 ViewController 中的 UIPickerView。目前,我的 ViewModel 中有两个公开的属性,项目:Observable(它是 UIPickerView 的数据源)和 selectedIndex:Variable。 selectedIndex 将驱动 UIPickerView 的初始值,但也会跟踪用户所做的任何更改。

我需要从 Observable 转换为 Variable 的原因是我需要弄清楚最初应该选择 UIPickerView 的哪个索引:

items.map { days -> Int in
    if let index = days.index(where: { str in
        return str == selectedDay
    }) {
        return index
    }
    return 0
}
.flatMap { num in
    return Variable<Int>(num)
}

我现在想知道我是否过于复杂了,是否应该只使用 Observable 来代替变量。

【问题讨论】:

    标签: rx-swift


    【解决方案1】:

    这里有几点:

    首先,您应该使用Variable,因为它已被弃用(可能会在 Swift 5 中完全弃用)。请查看BehaviorSubjectBehaviorRelay

    关于您的问题,我不确定让 Variable 等于 Observable 的用例是什么,所以我有两种不同的想法:

    1. 您可以将 Observable 绑定到变量/主题/中继(例如 observable.bind(to: variable)
    2. 实际上,您可以反过来从变量中获取一个可观察的,这可能更有意义。例如variable.asObservable()

    【讨论】:

    • 谢谢,我不知道该变量很快就会被弃用,所以这是一个很好的提示。我使用 Variable 的用例是我想在我的 ViewModel 中跟踪 UIPickerView 的选定行。从 observable 的转换将帮助我弄清楚最初选择的索引是什么(即,我会查找 Observable 并为所选索引返回一个 Variable)。
    • UIPickerView 已经有一个响应式扩展(picker.rx.itemSelected)。您可能想检查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多