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

RxSwift computed Variable combined from 2 other Variables

我需要 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
        }
    }
}
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/

在使用@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)