处理用户注册并使用MVVM模式中的RxSwift登录

时间:2018-03-17 13:49:51

标签: swift rx-swift

我正在使用基于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))

然后以某种方式区分两个事件,以确定,如果我必须先签名用户然后再登录,或者只需要签署用户。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

嗯,我不应该在logIn之后使用signUp。我建议的是,在两种情况下成功完成请求后,API会使用用户模型进行响应。这样,您可以merge两个流,并使用相同的处理程序。但是,如果您无法更改API,flatMap将成为解决方案,就像您所说的那样。您只需要有两个不同的流绑定到同一个处理程序。一个将flatMap直接logIn,其他人将使用signUp,然后logIn。我希望我能够足够清楚,并能以某种方式帮助你:)