2016-04-17 30 views
2

我刚开始使用Rx,并决定尝试使用RxSwift制作简单的OSX应用程序。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方法内 一旦方法结束,它就有效地将它带出示波器

相关问题