Я только начал играть с 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
Он удаляется, как только значение испускается после первоначальный.