こんにちは私はいくつかのRxSwiftを学んでいますが、なぜmakeLoginRequestが2回呼び出されたのか分かりません...ログインが正しいときは他のコントローラにプッシュしますが、RxSwiftで2つのイベントが発生しました
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)
}
とコントローラに
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)
誰もが何が起こっているかを説明することができます:それは、コードはこれですViewModelにで2回、次のコントローラ..
をプッシュ?
ありがとうございます!
あなたが指摘しているcredentialsValidで元の回答を編集しました。ネストされたサブプライベートを持たないように正しい方法は何ですか?問題は、makeLoginRequestメソッドが2回呼び出され、ビューコントローラをプッシュすることです.2回実行すると2回プッシュされ、絶対に間違っています。 – jerrygdm
もう一度、ネストされた 'subscribeNext'sの代わりに' flatMap'を使うべきです。これは現在の 'Observable'を置き換えますので、一度だけ購読することができます。あなたの編集内容は 'credentialValid'の使い方を示していますが、それは問題ではありません。未知の 'userName'、' password'、または 'provider'プロパティーが問題であると私はまだ信じています。しかし、コードを見ることなく、私は言うことができません。もう一度、この問題をここに投稿できる簡単なものにする必要があります。そうすることで何が間違っているのか分かりますが、そうでなければ、少なくとも実行することができます。 – solidcell
フラットマップの使い方を知りましたが、解決策ではありません。 – jerrygdm