2016-04-17 55 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方法內 一旦方法結束,它就有效地將它帶出示波器

相關問題