我正在为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块中)订阅是一种代码味道。
看来你有两个不同的问题。stateChanged
和profileCompleted
。
我会把它们分成两种不同的方法,一种是只负责反映listenToAuthState
结果的addStateDidChangeListener
,另一种是单独的listenToProfileCompleted
。
这将让你有一个单独的“准备”(或者你想怎么称呼它)可以压缩两者。或者使用flatMap,如果在监听配置文件完成之前身份验证状态必须更改。
关于ios - RxSwift正确地关闭处理预订,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51567825/