rxswift-第一次出错后进入处理袋

问题描述

每次出现错误时,我都会进入处理袋,即使输入了正确的密码也无法输入

需要您的帮助

MockMessageHandler mockMessageHandler = mockMessageHandler();
mockMessageHandler.handleNext(message -> { 
         throw new HttpClientErrorException.create(...);
});

this.mockIntegrationContext.substituteMessageHandlerFor("httpGateway",mockMessageHandler);

解决方法

Observable约定是,Observable将发出零个或更多next事件,然后发出停止事件,该事件可以是completederror。一旦可观察对象发出错误,则监听该对象的所有订阅都将完成并将被处置。这是不能商量的。

为了保持订阅有效,最终来源必须错误。最简单的方法是在flatMap中捕获错误并将其转换为其他错误。

以下是一个典型的登录订阅示例:

// in viewDidLoad or a function called from it:
loginButton.rx.tap
    .withLatestFrom(Observable.combineLatest(emailTextField.rx.text.orEmpty,passwordTextField.rx.text.orEmpty))
    .flatMapLatest { [viewModel] (email,password) in
        viewModel!.performLogin(email: email,password: password)
            .map { Result.success($0) }
            .catchError { Observable.just(Result.failure($0)) }
    }
    .subscribe(onNext: { [weak self] result in
        switch result {
        case .success:
            self?.loginSucceeded()
        case .failure(let error):
            self?.loginFailed(withError: error as? ApiError)
        }
    })
    .disposed(by: disposeBag)

即使网络产生错误,只要视图控制器存在,上述订阅也将一直存在。

,
self.loginViewModel.performLogin(email: email,password: password)
                .observeOn(MainScheduler.instance)
                .filter({ $0 != nil })
                .subscribe{ _ in
                    self.loginSucceeded()
            }.disposed(by: disposeBag)
            self.loginViewModel.observeError()
                .observeOn(MainScheduler.instance)
                .subscribe{
                    self.loginFailed(withError: $0.element as? ApiError)
            }.disposed(by: disposeBag)

感谢@ Daniel-这是我的灵魂之路