我正在使用基于MVVM模式的RxSwift构建iOS应用程序。我在应用程序启动时有一个基本的signUp / logIn表单,并想知道如何正确处理这些案例的干净反应式编程:基本上我使用RxSwift GitHub example作为我的登录表单的蓝图,但这仅处理“登录”,而不是“signUp”。具体的问题是,我的LoginViewModel中有let loggedIn: Driver<Bool>
,我的LoginViewController将在其上订阅,以便在登录时执行适当的操作,但loggedIn
不仅需要被触发当按下“登录按钮”时,LoginViewModel也应该在按下“signUp按钮”后登录。
假设我们使用以下init从LoginViewController实例化LoginViewModel:
init(
username: Driver<String>,
password: Driver<String>,
signUpTaps: Signal<Void>,
signInTaps: Signal<Void>
) {
我们使用以下代码(在LoginViewModel中)在从LoginViewController发送“signIn”tap事件时登录用户:
let usernameAndPassword = Driver.combineLatest(input.username, input.password) { (username: $0, password: $1) }
loggedIn = signInTaps.withLatestFrom(usernameAndPassword)
.flatMapLatest { usernameAndPassword in
return API.loginUser(with: usernameAndPassword.username, and: usernameAndPassword.password)
.asDriver(onErrorJustReturn: false)
}
其中API只是我的静态方法类,负责创建网络请求(作为注册和登录用户)。请注意,我的LoginViewModel内部没有订阅!
如何区分以此反应方式按下的“signUp”和“signIn”按钮,以便为两种情况正确设置可观察的loggedIn
?
为了在成功“signUp”之后触发“登录”请求,我可以使用flatMap()
,但是我如何才能登录?
我也想过像
loggedIn = Observable.combineLatest(signInTaps.withLatestFrom(usernameAndPassword), signUpTaps.withLatestFrom(usernameAndPassword))
然后以某种方式区分两个事件,以确定,如果我必须先签名用户然后再登录,或者只需要签署用户。
任何帮助都将不胜感激。
答案 0 :(得分:0)
嗯,我不应该在logIn
之后使用signUp
。我建议的是,在两种情况下成功完成请求后,API会使用用户模型进行响应。这样,您可以merge
两个流,并使用相同的处理程序。但是,如果您无法更改API,flatMap
将成为解决方案,就像您所说的那样。您只需要有两个不同的流绑定到同一个处理程序。一个将flatMap
直接logIn
,其他人将使用signUp
,然后logIn
。我希望我能够足够清楚,并能以某种方式帮助你:)