RxSwift:将Observable转换为变量

时间:2018-05-27 10:42:52

标签: rx-swift

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

这是我到目前为止所尝试的内容:

function getRandomArray() {
    return  [
    [3, "You find " + roll(1, 10) + " dollars."],
    [5, "You find " + roll(1, 20) + " dollars."],
    [9, "You find " + roll(1, 30) + " dollars."]
    ];
}
console.log(getRandomArray());
console.log(getRandomArray());

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

编辑:

只是给出一些关于为什么我需要将Observable转换为变量的上下文:

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

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

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

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

我现在想知道我是否过于复杂化,如果不是我的变量应该只有一个Observable。

1 个答案:

答案 0 :(得分:3)

这里有几点:

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

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

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