我剛開始使用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
一旦價值釋放後,最初的一個。