===========ViewModel ====================
importUIKit
importRxSwift
private let minimalUsernameLength = 1
private let minimalPwdLength = 1
class LoginViewModel {
// 输出
let phoneNumberValid: Observable
let passwordValid: Observable
let confirmPwdValid: Observable
let everythingValid: Observable
let validatedPasswordRepeated: Observable
// 输入 -> 输出
init( username: Observable, password: Observable, confirmPwd: Observable) {
phoneNumberValid= username
.map{ $0.count >=minimalUsernameLength}
.share(replay:1)
passwordValid= password
.map{ $0.count >=minimalUsernameLength}
.share(replay:1)
/*
share(replay: 1) 是用来做什么的?
我们用 usernameValid 来控制用户名提示语是否隐藏以及密码输入框是否可用。shareReplay 就是让他们共享这一个源,而不是为他们单独创建新的源。这样可以减少不必要的开支。
*/
confirmPwdValid= confirmPwd
.map{ $0.count >=minimalUsernameLength}
.share(replay:1)
validatedPasswordRepeated=Observable.combineLatest(password, confirmPwd).map({1}).share(replay:1)
everythingValid = Observable.combineLatest(
phoneNumberValid, passwordValid, confirmPwdValid, validatedPasswordRepeated
) { username, password, repeatPassword, allOk in
username && password && repeatPassword && allOk
} .distinctUntilChanged()
.share(replay:1)
}
}