2016-08-05 4 views
0

こんにちは私はいくつかのRxSwiftを学んでいますが、なぜmakeLoginRequestが2回呼び出されたのか分かりません...ログインが正しいときは他のコントローラにプッシュしますが、RxSwiftで2つのイベントが発生しました

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) 

誰もが何が起こっているかを説明することができます:それは、コードはこれですViewModelにで2回、次のコントローラ..

をプッシュ?

ありがとうございます!

答えて

1

あなたの問題は、表示されていないコード、おそらくuserName,、またはproviderにあります。また、credentialsValidも含まれていますが、使用されていません。もう一度、そのメソッドを使って何かを実際のコードでどのように使用しているのかが分かります。

ビューコントローラでは、subscribeNextをネストして使用しないでください。 flatMapを使用し、最終的にObservableに登録する必要があります。

私たちが実際に実行できる問題を示すコード例を思いついてから、助けてください。この例を作ることで、何が間違っているのか分かります。

+0

あなたが指摘しているcredentialsValidで元の回答を編集しました。ネストされたサブプライベートを持たないように正しい方法は何ですか?問題は、makeLoginRequestメソッドが2回呼び出され、ビューコントローラをプッシュすることです.2回実行すると2回プッシュされ、絶対に間違っています。 – jerrygdm

+0

もう一度、ネストされた 'subscribeNext'sの代わりに' flatMap'を使うべきです。これは現在の 'Observable'を置き換えますので、一度だけ購読することができます。あなたの編集内容は 'credentialValid'の使い方を示していますが、それは問題ではありません。未知の 'userName'、' password'、または 'provider'プロパティーが問題であると私はまだ信じています。しかし、コードを見ることなく、私は言うことができません。もう一度、この問題をここに投稿できる簡単なものにする必要があります。そうすることで何が間違っているのか分かりますが、そうでなければ、少なくとも実行することができます。 – solidcell

+0

フラットマップの使い方を知りましたが、解決策ではありません。 – jerrygdm

関連する問題