2017-10-11 59 views
0

如果我想在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中表达一个可以作为内联值以及流使用的计算属性吗?

回答

0

我遇到了同样的问题,最终出现了一个看起来不干净但工作正常的解决方案。我想补充一个新的var valid: Bool = false并订阅了isValid观察到,更新它

isValid.subscribe

(onNext:{?[薄弱的自我在自我价值.valid =有效})

有了这个isValid使用用于绑定和订阅,并且用于命令式代码的valid

顺便说一下您的isValid定义是怎么样的“不自然”,只是让一个let isValid: Observable<Bool>initisValid = username.asObservable().map({$0.characters.count > 0})

更新其分配:

另一种解决方案是使用RxBlockling,就可以得到当前值与try! isValid.toBlocking().single(),但我认为这是一个更糟糕的解决方案,通常不建议。在initviewDidLoad

let username = Variable("") 

private let _isValid: Observable<Bool> = username.asObservable().map{ $0.characters.count > 0 } 

let isValid = Variable(false) 

然后,或其它地方:

0

试试这个

_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 { 
    // ... 
} 
相关问题