我正在为Firebase身份验证函数编写一个包装器,以返回Observable并添加额外的profileIncomplete状态。它基本上首先检查用户是否登录,如果是,则检查用户的配置文件是否完整。下面是我的代码,我想知道是否可以订阅Observable.create中的一个observate,如果可以,在这种情况下,如何正确地处理disposable?在闭包内创建一个DisposeBag

enum State {
    case loggedIn
    case profileIncomplete
    case notLoggedIn
}

func listenToAuthState() -> Observable<State> {
    return Observable.create { observable in
        let authStateHandle = Auth.auth().addStateDidChangeListener() { [weak self] (_, user) in
            guard let user = user else {
                observable.onNext(.notLoggedIn)
                return
            }
            let disposable = self?.listenToProfileCompleted(uid: user.uid).subscribe(onNext: { (completed) in
                if completed {
                    observable.onNext(.loggedIn)
                    observable.onCompleted()
                } else {
                    observable.onNext(.profileIncomplete)
                }
            })
            // How to dispose the disposable???
        }
        return Disposables.create {
            Auth.auth().removeStateDidChangeListener(authStateHandle) }
        }
}

func listenToProfileCompleted(uid: String) -> Observable<Bool> { ... }

最佳答案

我认为在Observable.create中(或在不同的subscribe块中)订阅是一种代码味道。
看来你有两个不同的问题。stateChangedprofileCompleted
我会把它们分成两种不同的方法,一种是只负责反映listenToAuthState结果的addStateDidChangeListener,另一种是单独的listenToProfileCompleted
这将让你有一个单独的“准备”(或者你想怎么称呼它)可以压缩两者。或者使用flatMap,如果在监听配置文件完成之前身份验证状态必须更改。

关于ios - RxSwift正确地关闭处理预订,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51567825/

10-10 21:14