簡體   English   中英

如何模擬可訪問RxSwift中最新值的計算屬性?

[英]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)

然后,在您的initviewDidLoad或任何地方:

_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM