如何在RxSwift中模拟可以访问最新值的计算属性?
如果我想在RxSwift中模拟例如Bool
的标准属性,我可以使用let isValid = Variable<Bool>(false)
,然后使用.value
获取最后一个内联值,并使用.asObservable()
访问该流。如何在RxSwift中模拟可以访问最新值的计算属性?
但是,我想模拟计算propery例如var isValid { return self.password.characters.count > 0 }
,并且还能够以可观察流的形式获取最后的内联值。
我希望能够做到这两点,所以我可以写这样的代码......
if isValid.value { // isValid is Variable<Bool>
// ... do something ....
}
以及结合到例如一个TextField
我知道我可以作为一个纯Observable
写出如下...
var isValid: Observable<Bool> {
return self.username.asObservable().map { username in // username is Variable<String>
return username.characters.count > 0
}
}
但后来我不得不重构前面的例子是....
isValid.subscribe { isValid in
if isValid.element {
// ... do something ....
}
}.dispose(of: self.disposeBag)
如何那么我应该在RxSwift中表达一个可以作为内联值以及流使用的计算属性吗?
我遇到了同样的问题,最终出现了一个看起来不干净但工作正常的解决方案。我想补充一个新的var valid: Bool = false
并订阅了isValid
观察到,更新它
isValid.subscribe
(onNext:{?[薄弱的自我在自我价值.valid =有效})有了这个isValid
使用用于绑定和订阅,并且用于命令式代码的valid
。
顺便说一下您的isValid
定义是怎么样的“不自然”,只是让一个let isValid: Observable<Bool>
和init
像isValid = username.asObservable().map({$0.characters.count > 0})
更新其分配:
另一种解决方案是使用RxBlockling,就可以得到当前值与try! isValid.toBlocking().single()
,但我认为这是一个更糟糕的解决方案,通常不建议。在init
,viewDidLoad
let username = Variable("")
private let _isValid: Observable<Bool> = username.asObservable().map{ $0.characters.count > 0 }
let isValid = Variable(false)
然后,或其它地方:
试试这个
_isValid.asObservable()
.bind(to: isValid)
.disposed(by: bag)
你可以测试一下:
isValid.asObservable()
.subscribe(onNext: {
print("value: \($0)")
})
.disposed(by: disposeBag)
username.value = "xfreire"
// OUTPUTS:
// value: false
// value: true
,你仍然能做:
if isValid.value {
// ...
}