我需要从其他2个变量计算var isOn: Variable<Bool>
。如何在能够从isOn
变量中读取最新值的同时订阅其他变量的值更改?
以下是使用Observable
和Variable
类型的2个变量的错误解决方案。但我正在寻找正确的解决方案,基本上是将我的isOn
和isOnVariable
合并为一个。
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
}
}
}
答案 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并监听值更改,并且您可以随时访问from
和to
变量中的值。我不确定你要做什么,所以你可以改变.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)