RxSwift驱动程序在第一个值之后被释放

时间:2016-04-17 14:34:53

标签: swift cocoa rx-swift

我刚开始玩Rx并决定尝试使用RxSwift制作一个简单的OSX应用程序。

由于我的应用程序有登录表单,我发现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)
    }

}

这是我附加&#34; .debug()&#34;的示例。 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

一旦在初始值之后发出值,它就会被处理掉。

2 个答案:

答案 0 :(得分:1)

将您的LoginVM实例变量移动到类成员字段。

  

让vm = LoginVM(...

上面的'vm'实例在viewDidLoad()函数中具有局部性

答案 1 :(得分:0)

我有这个问题,因为我写了

viewDidLoad

<div class="container-fluid"> <div class="row"> ... </div> </div> 方法中。 一旦方法完成,它就有效地将其排除在范围之外。