2016-04-17 9 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です:私はLoginVMcredentialsEmptyドライバーに ".DEBUGを()" 添付すると、ここで

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

} 

は一例です:

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(... 'VM' インスタンス上で

0

()関数のviewDidLoadでの局所性を持っている私は

let disposeBag = DisposeBag() 

を書いたので、私はこの問題を抱えていましたviewDidLoadメソッド内 メソッドが終了するとすぐ有効範囲を有効にします。

関連する問題