RxSwift 计算变量由 2 个其他变量组合而成
RxSwift computed Variable combined from 2 other Variables
我需要 var isOn: Variable<Bool>
从另外 2 个变量计算得出。我如何订阅其他变量的值变化,同时又能从我的 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
}
}
}
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/
在使用@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)
我需要 var isOn: Variable<Bool>
从另外 2 个变量计算得出。我如何订阅其他变量的值变化,同时又能从我的 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
}
}
}
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/
在使用@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)