【问题标题】:RxSwift computed Variable combined from 2 other VariablesRxSwift 计算的变量由其他 2 个变量组合而成
【发布时间】:2017-11-22 06:19:02
【问题描述】:

我需要var isOn: Variable<Bool>,它是从其他 2 个变量计算而来的。如何订阅其他变量的值更改,同时还能从我的isOn 变量中读取最新值?

以下是使用ObservableVariable 类型的2 个变量的错误解决方案。但我正在寻找正确的解决方案,基本上是将我的isOnisOnVariable 合并为一个。

let from = Variable<Date?>(nil)
let to = Variable<Date?>(nil)

let isOnVariable = Variable<Bool>(false)
var isOn: Observable<Bool> {
    return Observable.combineLatest(from.asObservable(), to.asObservable()) { [weak self] to, from in
        switch (from, to) {
        case (.none, .none):
            self?.isOnVariable.value = false
            return false
        default:
            self?.isOnVariable.value = true
            return true
        }
    }
}

【问题讨论】:

    标签: ios swift rx-swift


    【解决方案1】:
    let from = Variable<Date?>(nil)
    let to = Variable<Date?>(nil)
    let isOnVariable = Variable<Bool>(false)
    Observable.merge(from.asObservable(), to.asObservable())
                .map { [weak self] (_) -> Void in
                    guard let `self` = self else {
                        return
                    }
                    switch (self.from.value, self.to.value) {
                    case (.none, .none):
                        self.isOnVariable.value = false
                    default:
                        self.isOnVariable.value = true
                    }
                }
                .subscribe()
                .disposed(by: disposeBag)
    

    现在您可以订阅 isOnVariable 并监听值的变化,并且在任何时候您都可以访问来自 fromto 变量的值。我不确定您要做什么,因此您可以更改.map 中的逻辑,但您明白了。 如果您对我使用weak self 的原因感兴趣,这是一本很好的阅读材料http://adamborek.com/memory-managment-rxswift/

    【讨论】:

    • 非常感谢!我发现了另一个遵循相同原则的选项,只是代码更简洁一些,请参阅下面的答案。
    • 这不应该在 do() 中完成吗?因为调用 self.isOnVariable.value 会产生一些副作用?
    【解决方案2】:

    在使用@markoaras 的答案时,还有另一个选项可以使用combineLatest 并将其绑定到isOn Variable。它遵循相同的原则。

    let isFromOpen = Variable<Bool>(false)
    let isToOpen = Variable<Bool>(false)
    let isOn = Variable<Bool>(false)
    Observable.combineLatest(from.asObservable(), to.asObservable()).map{ (from, to) -> Bool in
                return from != nil || to != nil
            }.bind(to: isOn).disposed(by: bag)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      相关资源
      最近更新 更多