Драйвер RxSwift удаляется после первого значения

Я только начал экспериментировать с Rx и решил попробовать создать простое приложение OSX с использованием RxSwift.

Поскольку в моем приложении есть форма входа, я обнаружил, что Пример GithubSignup очень похож на то, что я делаю.

Однако у меня возникла проблема с тем, что мои Drivers удаляются после того, как из них испускается первое значение, и я не могу понять, как и почему. Поскольку мой код действительно похож на код из примера Github, я должен что-то упустить.

Вот моя ViewModel:

class LoginVM {

    let isWorking: Driver<Bool>
    let loginEnabled: Driver<Bool>

    init(
        input: (
            email: Driver<String>,
            password: Driver<String>,
            loginRequests: Driver<Void>
        ),
        dependency: (
            RoundedClient
        )
    ) {
        self.isWorking = Variable(false).asDriver()

        let credentials = Driver
            .combineLatest(input.email, input.password){ (email: $0, password: $1) }

        let credentialsEmpty = credentials
            .map{ credentials in
                credentials.email.characters.count > 0 && credentials.password.characters.count > 0
            }
            .distinctUntilChanged()

        self.loginEnabled = Driver
            .combineLatest(credentialsEmpty, self.isWorking){ !($0 || $1) }
            .distinctUntilChanged()
    }

}

А вот и мой ViewController:

class LoginViewController: NSViewController {

    var screenManager: ScreenManager!

    @IBOutlet weak var emailField: NSTextField!
    @IBOutlet weak var passwordField: NSSecureTextField!
    @IBOutlet weak var loginButton: NSButton!
    @IBOutlet weak var loginSpinner: NSProgressIndicator!
    @IBOutlet weak var errorLabel: NSTextField!

    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        let vm = LoginVM(
            input: (
                email: self.emailField.rx_text.asDriver(),
                password: self.passwordField.rx_text.asDriver(),
                loginRequests: self.loginButton.rx_tap.asDriver()
            ),
            dependency: RoundedClient.sharedInstance
        )

        vm.loginEnabled
            .driveNext{ [weak self] enabled in
                self?.loginButton.enabled = enabled
                self?.loginButton.alphaValue = enabled ? 1.0 : 0.5
            }.addDisposableTo(self.disposeBag)

        vm.isWorking
            .drive(self.loginSpinner.ex_animating)
            .addDisposableTo(self.disposeBag)
    }

}

Вот пример, когда я прикрепляю ".debug ()" к credentialsEmpty драйверу на LoginVM:

2016-04-17 16:32:36.730: LoginViewController.swift:38 (init(input:dependency:)) -> subscribed
2016-04-17 16:32:36.731: LoginViewController.swift:38 (init(input:dependency:)) -> Event Next(false)
2016-04-17 16:32:39.081: LoginViewController.swift:38 (init(input:dependency:)) -> Event Next(true)
2016-04-17 16:32:39.081: LoginViewController.swift:38 (init(input:dependency:)) -> disposed

Он удаляется, как только значение выдается после начального.


person Igor Pantović    schedule 17.04.2016    source источник


Ответы (2)


переместите переменную экземпляра LoginVM в поле члена класса.

let vm = LoginVM (...

выше экземпляр 'vm' имеет местоположение в функции viewDidLoad ()

person DeockJin Chung    schedule 23.05.2016

У меня была эта проблема, потому что я написал

let disposeBag = DisposeBag()

внутри метода viewDidLoad. Что фактически вывело его из поля зрения, как только метод завершился.

person Shiyason    schedule 04.08.2017