RxSwift计算变量由2个其他变量组合而成

时间:2017-11-20 20:45:41

标签: ios swift rx-swift

我需要从其他2个变量计算var isOn: Variable<Bool>。如何在能够从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
        }
    }
}

2 个答案:

答案 0 :(得分:2)

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/

答案 1 :(得分: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)