2016-04-17 6 views
2

Я только начал играть с Rx и решил попробовать сделать простое приложение OSX с помощью RxSwift.RxSwift Драйвер получает после первого значения

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

У меня есть проблема с тем, что мои 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 

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

ответ

1

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

пусть Vm = LoginVM (...

выше, например "ВМ имеет расположение в viewDidLoad функции()

0

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

let disposeBag = DisposeBag() 

внутри метода viewDidLoad. Который эффективно вывел его из области действия, как только закончен законченный метод.