我刚开始玩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
一旦在初始值之后发出值,它就会被处理掉。
答案 0 :(得分:1)
将您的LoginVM实例变量移动到类成员字段。
让vm = LoginVM(...
上面的'vm'实例在viewDidLoad()函数中具有局部性
答案 1 :(得分:0)
我有这个问题,因为我写了
viewDidLoad
在<div class="container-fluid">
<div class="row">
...
</div>
</div>
方法中。
一旦方法完成,它就有效地将其排除在范围之外。