Событие касания RxSwift не запущено - PullRequest
0 голосов
/ 18 декабря 2018

Я реализую mvvm, используя RxSwif.

Вот что происходит:

  • Проверка полей (введите 7 символов в оба текстовых поля).
  • Нажмите кнопку входа в систему.
  • API isВызывается, что нормально.
  • Нажмите кнопку еще раз.
  • API не вызывается.

Я заметил, что «validObservable» меняется каждый раз, когда я что-то пишув textFields это нормально.

ViewController:

    var viewModel: LoginViewModelType!
  let disposeBag = DisposeBag()
  @IBOutlet weak var dniTextField: UITextField!
  @IBOutlet weak var passwordTextField: UITextField!
  @IBOutlet weak var logInButton: UIButton!

  override func viewDidLoad() {
    super.viewDidLoad()


    logInButton.rx
      .tap
      .bind(to: viewModel.inputs.logInButtonDidTap)
      .disposed(by: disposeBag)


    dniTextField.rx
      .text
      .bind(to: viewModel.inputs.dniChanged)
      .disposed(by: disposeBag)

    passwordTextField.rx
      .text
      .bind(to: viewModel.inputs.passwordChanged)
      .disposed(by: disposeBag)


    /*viewModel.outputs.isLoginButtonEnabled
      .drive(onNext: { [weak self] isEnabled in
        guard let `self` = self else { return }
        self.logInButton.isEnabled = isEnabled
      })
      .disposed(by: disposeBag)
    */

    viewModel.outputs.logIn
      .drive(onNext: { [weak self] user in
        guard let `self` = self else { return }
        self.performSegue(withIdentifier: "showMainController", sender: user)
      })
      .disposed(by: disposeBag)
  }

  override func awakeFromNib() {
    super.awakeFromNib()
    viewModel = LoginViewModel()
  }

ViewModel:

    var inputs: LoginViewModelInputs { return self }
  var outputs: LoginViewModelOutputs { return self }

  // ---------------------
  // MARK: - Inputs
  // ---------------------
  var dniChanged: BehaviorRelay<String?>
  var passwordChanged: BehaviorRelay<String?>
  var logInButtonDidTap: PublishSubject<Void> = PublishSubject<Void>()


  // ---------------------
  // MARK: - Outpuds
  // ---------------------
  var logIn: Driver<User>
  var isLoginButtonEnabled: Driver<Bool>

  private let disposeBag = DisposeBag()

  public init () {
    dniChanged = BehaviorRelay<String?>(value: "")
    passwordChanged = BehaviorRelay<String?>(value: "")

    let dniObservable = dniChanged.asDriver().filterNil().asObservable()
    let passwordObservable = passwordChanged.asDriver().filterNil().asObservable()

    let dniValidation = dniObservable.map { $0.count > 4 }
    let passwordValidation = passwordObservable.map { $0.count > 3 }

    let validObservable = Observable.combineLatest(dniValidation, passwordValidation) { return $0 && $1 }.filter { $0 }

    isLoginButtonEnabled = validObservable.asDriver(onErrorDriveWith: .empty())

    let loginSuccessObservable = Observable.combineLatest(dniObservable, passwordObservable, validObservable) { (dni, password, valid) -> LogInRequest in
      return LogInRequest(dni: dni, password: password)
    }

    logIn = logInButtonDidTap.withLatestFrom(loginSuccessObservable).flatMapLatest({ request -> Observable<User> in
      return API.shared.post(endpoint: EndPoints.Authorize, type: User.self, body: request)
    }).asDriver(onErrorDriveWith: .empty())
  }

1 Ответ

0 голосов
/ 18 декабря 2018

Я бы сказал, что .empty () вызывает завершение наблюдаемого и, как следствие, удаление подписки.

Я бы добавил несколько инструкций .debug (), чтобы убедиться, что и когда будет утилизировано.

...