2017-08-29 10 views
1

私のViewModelrxSwiftボタンを押しオブザーバー問題

init(login: Observable<String>, password: Observable<String>, buttonPress: Observable<Void>) { 
     let userInputs = Observable.combineLatest(login, password) { (login, password) -> (String, String) in 
      return (login, password) 
     } 

     let callFromPress = buttonPress 
      .withLatestFrom(userInputs) 
      .map { (login, password) in 
       self.makeLoginRequest(userLogin: login, loginPassword: password, loginSecret: self.loginSecret, deviceToken: self.deviceToken) 
     } 
    } 

にrxSwiftのためのオブザーバーの取扱いを設定INITを持っている私は、ボタンをタップするとしかし、何も起こりません。それはVCに縛られています:

buttonPress: self.loginView.loginButton.rx.tap.asObservable() 

エラーが発生しても何もトリガーしない理由は何ですか?

更新:

init(login: Observable<String>, password: Observable<String>, buttonPress: Observable<Void>) { 
    let userInputs = Observable.combineLatest(login, password) { (login, password) -> (String, String) in 
     return (login, password) 
    } 

    buttonPress.subscribe(onNext: { each in 
     print(each) 
      .withLatestFrom(userInputs) 
      .map { (login, password) in 
       self.makeLoginRequest(userLogin: login, loginPassword: password, loginSecret: self.loginSecret, deviceToken: self.deviceToken) 
     } 
    }).disposed(by: self.disposeBag) 
} 

エラー:

Extraneous argument label 'onNext:' in call

アップデート2:

init(login: Observable<String>, password: Observable<String>) { 
    // each time the login and password change, returns login and string value 
    didTapLoginButton = { [weak self] _ in 
     // allows for strong self reference 
     guard let `self` = self else { return } 

     Observable.combineLatest(login, password) { (login, password) in 
      // 
      } 
      .subscribe(onNext: { response in 
       self.makeLoginRequest(userLogin: login, loginPassword: password, loginSecret: self.loginSecret, deviceToken: self.deviceToken) 
       // do something with your response 
      }) 
      .disposed(by: self.disposeBag) 

    } 
} 

答えて

1

.subscribeを追加します。観測者は、サブスクライバを持つまでイベントを送信しません。

例:あなたはそれを購読すると

let observable = Observable.from([1,2,3,4,5,6]) // won't send events. It's only the declaration. 

、物事が起こる:

observable.subscribe(onNext: { each in 
    print(each) // Will print each number 
}) 
.disposed(by: disposeBag) // add a dispose bag 

私はそれをしようとしなかったが、あなたの特定のケースで、私はこのような何かをするだろう。

1- viewModelには、Clousureプロパティを追加します。

var didTapLoginButton:() -> Void = { _ in } 
あなたの viewController

2 - - viewDidLoad()方法:あなたのviewModel

self.loginView.loginButton.rx.tap.asObservable() 
    .subscribe(onNext: { [weak self] _ in 
     self?.viewModel.didTapLoginButton() 
    }) 
    .disposed(by: bag) 

、3-:

init(login: Observable<String>, password: Observable<String>) { 

    didTapLoginButton = { [weak self] _ in 
     // This let you call self as strong reference instead optional 
     guard let `self` = self else { return } 

     Observable.combineLatest(login, password) { (login, password) -> (String, String) in 
      self.makeLoginRequest(userLogin: login, loginPassword: password, loginSecret: self.loginSecret, deviceToken: self.deviceToken) 
     } 
     .subscribe(onNext: { response in 
      // do something with your response 
     }) 
     .disposed(by: bag) 

    } 
} 
+0

おかげで、私は今、ボタンを押すのコードでOPを更新しますが、上のエラーをスローします処分バッグ:表現型 '()'は文脈がなくてもあいまいです...さらなる問題があると思いますか? – jackdm

+0

私はあなたのユースケースで行うより詳細な私の答えを編集しました。 – XFreire

+0

LoginRequest関数の結果タイプ '(String、String)'を閉じて ''() 'の値を変換できません。 – jackdm

関連する問題