簡體   English   中英

rxSwift按鈕按下觀察器問題

[英]rxSwift Button Press Observer Issue

我有一個初始化程序,在我的viewModel上設置rxSwift的觀察者處理

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)
        }
    }

但是,當我點擊按鈕時,什么也沒有發生。 它按如下方式連接到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)
}

錯誤:

調用中的無關參數標簽“ onNext:”

更新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)

    }
}

添加.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)

    }
}

就我而言

subscribe(onNext: { [weak self] in

當我應該做的時候

subscribe(onNext: { [weak self] _ in

這消除了錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM