我有一個rxswift的基本問題。 我有一個登錄屏幕,應該調用視圖模型在我的登錄方法當且僅當我點擊登錄按鈕僅在rx_tap事件上調用方法
loginButton.rx_tap
.doOn({[unowned self] _ in
self.loginButton.enabled = false
})
.flatMap({[unowned self] in self.loginModel.login() })
.subscribeNext({ [weak self] login in
self?.loginButton.enabled = true
guard login?.result == 1 else {
self?.showErrorWithMessage(login!.message)
return;
}
// Logged in!
})
.addDisposableTo(disposeBag)
看起來不錯,但如果登錄失敗,因爲憑證無效,並且用戶重新輸入上的文本字段調用loginModel.login()再次發射......
內部視圖模型還有:
var credentials : Driver<(String, String)> {
return Driver.combineLatest(userNameDriver.distinctUntilChanged(), passwordDriver.distinctUntilChanged()) { usr, pwd in
return (usr, pwd)
}
}
var usrValid : Driver<Bool> {
get {
return userNameDriver
.throttle(0.5)
.filterEmpty()
.distinctUntilChanged()
.map { ($0.rangeOfString("@") != nil) || ($0.utf8.count == 0) }
}
}
var pwdValid : Driver<Bool> {
get {
return passwordDriver
.throttle(0.5)
.filterEmpty()
.distinctUntilChanged()
.map { ($0.utf8.count > 5) || ($0.utf8.count == 0) }
}
}
var usernameBorderColor : Observable<UIColor>!
var passwordBorderColor : Observable<UIColor>!
var credentialValid : Driver<Bool> {
return Driver.combineLatest(usrValid, pwdValid) { usr, pwd in
return (usr && pwd)
}
}
有人能幫助我嗎? 謝謝
嘿!我不能重現這個錯誤,因爲它對我來說並不明顯。你可以在Github上創建簡單的項目嗎?我將克隆它,幫助您解決它並在此主題中編寫解決方案。 – Svyatoslav
在這裏您可以找到該項目:https://github.com/jerrygdm/RxTap_Issue我只是添加一個示例來查看問題。如果你在textfield用戶中輸入並傳遞,並且在你點擊登錄後你有一個基於結果的回覆....例如你寫錯了憑證並點擊登錄,你會在subscribeNext中得到結果,但是如果你嘗試寫新的信號再次啓動證書....我只想取消先前的信號,並且僅在點擊按鈕登錄時才觸發新信號。 – jerrygdm