Alors que la mise en place en vue de la connexion et l'utilisation de la programmation réactive pour la première fois - je ne parviens pas à générer un signal de mon ViewContoller qui alertera mon auditeur observeValues
à mon avis avec un Bool contenant ma validation de formulaire:Réagir à un signal dans MVVM?
Voir fichier
viewModel.outputs.loginSuccess
.observeValues { [weak self] value in
print(value)
}
Avec mon code actuel loginSuccess
on tire à chaque fois que les champs de texte e-mail ou mot de passe sont modifiés (je .addTarget
« s dans mon dossier Voir qui mettent à jour mes MutableProperites dans mon modèle Voir fichier). Lorsque je rencontre des problèmes, je crée un signal pour tryLogin
qui émet uniquement lorsque le bouton de connexion est enfoncé, puis mappe ma validation de formulaire (emailAndPassword.map(isValid)
), à laquelle je peux répondre dans mon fichier View.
Modèle Afficher le fichier
import ReactiveCocoa
import ReactiveSwift
import Result
public protocol LoginViewModelInputs {
/// String value of email textfield text
func emailChanged(_ email: String?)
/// String value of password textfield text
func passwordChanged(_ password: String?)
/// Call when login button is pressed.
func loginButtonTapped()
}
public protocol LoginViewModelOutputs {
/// Emits on login.
var loginSuccess: Signal<(Bool), NoError> { get }
}
public protocol LoginViewModelType {
var inputs: LoginViewModelInputs { get }
var outputs: LoginViewModelOutputs { get }
}
public final class LoginViewModel: LoginViewModelType, LoginViewModelInputs, LoginViewModelOutputs {
public init() {
let emailAndPassword = Signal.combineLatest(
self.emailChangedProperty.signal.skipNil(),
self.passwordChangedProperty.signal.skipNil()
)
let tryLogin = loginButtonTappedProperty.map {
emailAndPassword.map(isValid)
}
self.loginSuccess = tryLogin.value
}
fileprivate let emailChangedProperty = MutableProperty<String?>(nil)
public func emailChanged(_ email: String?) {
self.emailChangedProperty.value = email
}
fileprivate let loginButtonTappedProperty = MutableProperty()
public func loginButtonTapped() {
self.loginButtonTappedProperty.value =()
}
fileprivate let passwordChangedProperty = MutableProperty<String?>(nil)
public func passwordChanged(_ password: String?) {
self.passwordChangedProperty.value = password
}
public let loginSuccess: Signal<(Bool), NoError>
public var inputs: LoginViewModelInputs { return self }
public var outputs: LoginViewModelOutputs { return self }
}
func isValid(email: String, password: String) -> Bool {
return !email.characters.isEmpty && !password.characters.isEmpty
}
Toute aide est appréciée. Je n'ai pas trouvé beaucoup de bonne documentation pour me renseigner sur les signaux ou les observateurs, mais il est possible que je n'ai pas cherché dans les bons endroits.
cool merci! C'est très facile à deviner! –