2017-08-29 96 views
1

我有一个设置为rxSwift观察员的处理上我的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) 
     } 
    } 

一个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 } 

2。在你的viewController - viewDidLoad()方法:

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

3-在你viewModel

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