Hallo Ich lerne etwas RxSwift, ich verstehe nicht, warum makeLoginRequest zweimal aufgerufen wird ... wenn Login korrekt ist, schiebe ich zu einem anderen Controller, aber das Observable benachrichtigt noch ein anderes Ereignis so schieben sie es zweimal am nächsten Controller ..Zwei Ereignisse gefeuert mit RxSwift
im Ansichtsmodell der Code ist dies:
let userName : Driver<String>
let password : Driver<String>
var credentials : Driver<(String, String)> {
return Driver.combineLatest(userName, password) { usr, pwd in
return (usr, pwd)
}
}
var credentialValid : Driver<Bool> {
let usrValid = userName
.map { $0.rangeOfString("@") != nil }
let pwdValid = password
.map { $0.utf8.count > 5 }
return Driver.combineLatest(usrValid, pwdValid) { usr, pwd in
return (usr && pwd)
}
}
func login() -> Observable<Login?>
{
return credentials.asObservable()
.observeOn(MainScheduler.instance)
.flatMapLatest { credential -> Observable<Login?> in
return self.makeLoginRequest(user: credential.0, password: credential.1)
}
}
func makeLoginRequest(user user: String, password: String) -> Observable<Login?>
{
return self.provider
.request(APIProvider.Login(credentials: (user, password)))
.debug()
.mapObjectOptional(Login.self)
}
und in der Steuerung
loginModel = LoginViewModel(provider: apiProvider! as! RxMoyaProvider<APIProvider>, userName: userTextField.rx_text.asDriver(), password: passwordTextField.rx_text.asDriver())
loginModel.credentialValid
.driveNext { [unowned self] valid in
self.loginButton.enabled = valid
}
.addDisposableTo(disposeBag)
loginButton.rx_tap
.debug()
.flatMap({ self.loginModel.login() })
.subscribeNext({ login in
// handle here login data
})
.addDisposableTo(disposeBag)
Wer kann erklären, was los ist?
Danke!
Ich habe die ursprüngliche Antwort mit CredentialsValid bearbeitet, auf die Sie hinweisen. Was ist der richtige Weg, um keinen verschachtelten SubscribeNext zu haben? Das Problem ist, dass die Methode makeLoginRequest zweimal aufgerufen wird und einen View-Controller verschiebt. Wenn sie zweimal ausgeführt wird, wird sie zweimal gedrückt und es ist absolut falsch. – jerrygdm
Auch hier sollten Sie 'flatMap' anstelle von verschachtelten' subscribeNext's verwenden, die das aktuelle 'Observable' ersetzen, so dass Sie nur einmal abonnieren können. Ihre Änderung zeigt, wie Sie 'credentialValid' verwenden, aber das scheint nicht das Problem zu sein. Ich glaube immer noch, dass die unbekannten Eigenschaften 'userName',' password' oder 'provider' das Problem sein könnten. Aber wieder, ohne Code zu sehen, kann ich nicht sagen. Und wieder sollten Sie dieses Problem auf etwas Einfaches reduzieren, das Sie hier veröffentlichen können. Sie werden wahrscheinlich herausfinden, was falsch ist, und wenn nicht, können wir es zumindest ausführen. – solidcell
Ich finde heraus, wie ich Flatmap dort verwenden kann ... aber es ist nicht die Lösung. – jerrygdm