RxSwift 绑定

53 阅读1分钟

WeChat73c930e10630fc3b8ae413d7c677bd8a.png

===========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({0==0 == 1}).share(replay:1)

        everythingValid = Observable.combineLatest(

            phoneNumberValid, passwordValid, confirmPwdValid, validatedPasswordRepeated

        ) { username, password, repeatPassword, allOk  in

            username && password && repeatPassword && allOk

        } .distinctUntilChanged()

            .share(replay:1)

      }

}