[英]How do I emulate a computed property with access to the latest value in RxSwift?
如果要在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中表達一個計算屬性,該屬性可以作為內聯值和流使用?
我遇到了同樣的問題,最終得到的解決方案看起來不干凈,但可以正常工作。 我將添加一個新的var valid: Bool = false
和對isValid
observable的訂閱以對其進行更新
isValid.subscribe(onNext:{self中的[weak self]值?.valid = valid})
使用此方法, isValid
用於綁定和訂閱,並且在命令式代碼中valid
。
順便說一句,您對isValid
的定義有點“不自然”,只要讓它成為let isValid: Observable<Bool>
並像isValid = username.asObservable().map({$0.characters.count > 0})
這樣在init
分配即可isValid = username.asObservable().map({$0.characters.count > 0})
更新:
另一個解決方案是使用RxBlockling,您可以try! isValid.toBlocking().single()
使用當前值try! isValid.toBlocking().single()
try! isValid.toBlocking().single()
但我認為這是一個較差的解決方案,通常不建議這樣做。
嘗試這個:
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 {
// ...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.