允许用户取消登录尝试并在不破坏Observable的情况下手动重试

问题描述 投票:1回答:1

说我有一个登录按钮,该按钮绑定到我的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)
  }
}

我如何处理取消按钮的点击,以便它可以有效地“重置”事物,以便用户可以再次尝试登录?

ios swift rx-swift
1个回答
0
投票

使用类似这样的内容:

© www.soinside.com 2019 - 2024. All rights reserved.