说我有一个登录按钮,该按钮绑定到我的VM中的观察者。
[当用户点击按钮时,它会触发异步API调用。 VC在VM公开的Observable上侦听调用结果。
我显示一个取消按钮,以防异步活动卡住或用户意识到他们输入了错误的密码并想再试一次。如果用户取消,我想有效地取消或忽略由于第一次点击而发出的事件,并允许用户在准备就绪后再次点击“登录”。
设置是这样的:
class SimpleVM {
struct Output {
let loginResponse: Observable<LoginResponse>
}
struct Input {
let loginDidTap: AnyObserver<Void>
let cancelDidTap: AnyObserver<Void>
}
let output: Output
let input: Input
private let loginSubject = PublishSubject<Void>()
private let cancelSubject = PublishSubject<Void>()
init() {
let response = loginSubject
.flatMapLatest { _ in
loginService.login(username, password)
}
cancelSubject
.flatMapLatest { _ in
// do something here?
}
input = Input(loginDidTap: loginSubject.asObserver(), cancelDidTap: cancelSubject.asObserver())
output = Output(loginResponse: response)
}
}
class SimpleVC: UIViewController {
var loginButton: UIButton!
var cancelButton: UIButton!
let disposeBag = DisposeBag()
func bind(vm: SimpleVM) {
loginButton.rx.tap
.bind(to: vm.input.loginDidTap)
.disposed(by: disposeBag)
cancelButton.rx.tap
.bind(to: vm.input.cancelDidTap)
.disposed(by: disposeBag)
vm.output.loginResponse
.subscribe(onNext: { response in
print("Got token \(response.info.token)")
}).disposed(by: disposeBag)
}
}
我如何处理取消按钮的点击,以便它可以有效地“重置”事物,以便用户可以再次尝试登录?
使用类似这样的内容: