0

こんにちは、私はいくつかの RxSwift を学んでいます。makeLoginRequest が 2 回呼び出される理由がわかりません...ログインが正しいときに他のコントローラーにプッシュしますが、オブザーバブルは他のイベントを通知するため、次のコントローラーを 2 回プッシュします。 .

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)

誰が何が起こっているのか説明できますか?

ありがとう!

4

1 に答える 1

1

あなたの問題はおそらく、表示されていないコードにあります: userNamepassword、またはprovider. また、 を含めましcredentialsValidたが、使用されていません。繰り返しますが、おそらくそのメソッドと、実際のコードでそれをどのように使用しているかということです。

補足としてsubscribeNext、View Controllerでそのようにネストされたものを使用しないでください。flatMapfinal のみを使用してサブスクライブする必要がありますObservable

実際に実行できる問題を示すコード例を考え出すことができるかどうかを確認してください。その例を作成することで、おそらく自分で何が問題なのかを理解できるでしょう。

于 2016-08-06T10:18:43.733 に答える