您好我正在学习一些RxSwift,我不明白为什么makeLoginRequest被调用两次...当登录正确时我推送到另一个控制器,但是observable仍然通知另一个事件所以它推了两次下一个控制器..
在viewModel中代码是这样的:
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)
任何人都可以解释发生了什么?
谢谢!
答案 0 :(得分:1)
您的问题可能在于您尚未展示的代码:userName
,password
或provider
。此外,您添加了credentialsValid
,但未使用它。再次,也许是使用该方法的东西,以及您如何在实际代码中使用它。
在旁注中,您不应该在视图控制器中使用subscribeNext
嵌套。您应该使用flatMap
并订阅最终的Observable
。
看看你是否能够提供一个代码示例来展示我们实际可以运行的问题,然后我们可以提供帮助。你可以通过这个例子自己弄清楚自己的错误。