rx.tap 订阅已完成的按钮

Button with rx.tap subscription reaching completed

我是 RxSwift 的新手,我正在尝试实现登录 facebook 功能,这就是我正在做的事情:

loginButton.rx.tap
            .debug("login tapped")
            .flatMap { [weak self] ()->Observable<AccessToken> in
                guard let strongSelf = self else {
                    throw NetworkError.requestCancelled
                }
                return strongSelf.viewModel.loginFacebook(from: strongSelf)
            }
            .flatMap { [weak self] accessToken->Observable<(accessToken: String, userId: String)> in
                guard let strongSelf = self else {
                    throw NetworkError.requestCancelled
                }
                return strongSelf.viewModel.requestUserInfo(token: accessToken)
            }
            .flatMap { [weak self] (accessToken: String, userId: String)->Observable<LoginResult> in
                guard let strongSelf = self else {
                    throw NetworkError.requestCancelled
                }
                return strongSelf.viewModel.authenticate(accessToken: accessToken, userId: userId)
            }
            .catchError({ error -> Observable<LoginResult> in
                return Observable.just(LoginResult.failure(error: error as! NetworkError))
            })
            .subscribe (onNext:{ [weak self] result in
                guard let strongSelf = self else {
                    return
                }

                switch result {
                case .success:
                    // do something with success
                    }
                case .failure(let error):
                    // do something with error
                }
            }, onCompleted: {
                print("rx.tap completed")
            })
            .disposed(by: disposeBag)

当我点击登录按钮然后关闭弹出的 Facebook 登录 window 时,我对 rx.tap 的订阅达到 onCompleted,所以当我尝试点击再次按下按钮,没有任何反应。我应该如何处理这种情况?任何建议都会有所帮助。

这是你链的简化方案:

loginButton.rx.tap
    .flatMap({ (_) -> Observable<Void> in
        throw NSError(domain: "", code: 0, userInfo: [:])
    })
    .catchError({ error -> Observable<Void> in
        return Observable<Void>.just()
    })
    .subscribe()

当你在 catchError 块中产生 Observable<Void>.just() 或在其他块中产生类似的东西时,它只会触发一次,这就是你收到 completed 并且之后没有其他任何事情发生的原因。例如,我建议将您拥有的所有代码放入 flatMapLatest 中。结果代码将是:

loginButton.rx.tap
    .flatMapLatest({ _ -> Observable<Void> in
        return Observable<Void>
            .just()
            .flatMap({ (_) -> Observable<Void> in
                throw NSError(domain: "", code: 0, userInfo: [:])
            })
            .catchError({ error -> Observable<Void> in
                return Observable<Void>.just()
            })
    })
    .subscribe()

希望对您有所帮助

P.S。检查来自 RxSwift 开发团队成员的 similar answer