I am building a simple login page which will check for username before navigating to another screen and here is how I am doing the binding now. I would like to know if I am doing it right and if I am not, what is the recommended way of doing the binding. Moreover, I creating the UI programmatically.
ViewModel.swift
// Inputs
private let usernameSubject = PublishSubject<String>()
private let nextButtonDidTapSubject = PublishSubject<Void>()
// Outputs
private let validUsernameSubject = PublishSubject<Bool>()
private let invalidUsernameSubject = PublishSubject<String>()
// MARK: - Init
init() {
input = Input(username: usernameSubject.asObserver(),
nextButtonDidTap: nextButtonDidTapSubject.asObserver())
output = Output(validUsername: validUsernameSubject.asObservable(),
invalidUsername: invalidUsernameSubject.asObservable())
nextButtonDidTapSubject
.withLatestFrom(usernameSubject.asObservable())
.subscribe(onNext: { [unowned self] text in
if text.count >= self.minUsernameLength {
self.validUsernameSubject.onNext(true)
} else {
let message = text.count > 0 ?
"Please enter a valid username" :
"Please enter a username"
self.invalidUsernameSubject.onNext(message)
}
})
.disposed(by: disposeBag)
}
ViewController.swift
private func configureBinding() {
loginLandingView.usernameTextField.rx.text.orEmpty
.subscribe(viewModel.input.username)
.disposed(by: disposeBag)
loginLandingView.nextButton.rx.tap
.subscribe(viewModel.input.nextButtonDidTap)
.disposed(by: disposeBag)
viewModel.output.validUsername
.subscribe(onNext: { [unowned self] _ in
print("Valid username - Navigate...")
self.navigate()
})
.disposed(by: disposeBag)
viewModel.output.invalidUsername
.subscribe(onNext: { [unowned self] message in
self.showAlert(with: message)
})
.disposed(by: disposeBag)
}