如果我想在RxSwift中模拟一个标准属性,比如一个Bool,我可以使用let isValid = Variable<Bool>(false),然后使用.value来获取最后一个值,使用.asObservable()来访问流。
然而,我想要模拟一个计算的属性,例如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中表达一个可以作为内联值和流使用的计算属性呢?
发布于 2017-10-11 23:01:46
我遇到了同样的问题,最终得到了一个看起来不干净但有效的解决方案。我将向更新它的isValid可观察对象添加一个新的var valid: Bool = false和一个订阅
isValid.subscribe(onNext:{ self?.valid中的弱自身值=有效})
在这种情况下,isValid用于绑定和订阅,valid用于命令式代码。
顺便说一句,你对isValid的定义有点“不自然”,只要把它变成一个let isValid: Observable<Bool>,然后像isValid = username.asObservable().map({$0.characters.count > 0})一样在init中赋值即可
更新:
另一种解决方案是使用RxBlockling,您可以使用try! isValid.toBlocking().single()获得当前值,但我认为这是一个更糟糕的解决方案,通常不推荐使用。
发布于 2017-10-11 23:18:02
试试这个:
let username = Variable("")
private let _isValid: Observable<Bool> = username.asObservable().map{ $0.characters.count > 0 }
let isValid = Variable(false)然后,在你的init、viewDidLoad或其他任何地方:
_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 {
// ...
}https://stackoverflow.com/questions/46690698
复制相似问题