我正在使用Firebase FirAuth API,并且在API返回结果之前,Disposables.create()已被返回并且不再可点击(我知道这可能是由于API之后没有observer.onCompleted叫。有没有办法等待它/听的结果?RxSwift回调首先返回结果
public func login(_ email: String, _ password: String) -> Observable<APIResponseResult> {
let observable = Observable<APIResponseResult>.create { observer -> Disposable in
let completion : (FIRUser?, Error?) -> Void = { (user, error) in
if let error = error {
UserSession.default.clearSession()
observer.onError(APIResponseResult.Failure(error))
observer.on(.completed)
return
}
UserSession.default.user.value = user!
observer.onNext(APIResponseResult.Success)
observer.on(.completed)
return
}
DispatchQueue.main.async {
FIRAuth.auth()?.signIn(withEmail: email, password: password, completion: completion)
}
return Disposables.create()
}
return observable
}
火力地堡是异步的,目的不是要以同步的方式返回数据:
我通过捕捉错误,并传回的案件
.success(MyType)
和.error(Error)
例的
enum
解决它。虽然你可以强制这种模式,但会导致很多长期问题。所有的DispatchQueue和回调都应该被删除,否则它将成为一个噩梦来排除故障。让Firebase完成它的工作;一旦Firebase关闭内部的数据可用,然后继续进入用户界面的下一步,处理该数据等。代码可能过于复杂 - 也许如果您可以解释您正在尝试完成的内容,则明确的解决方案可能是提供而不是解决方法。 – Jay谢谢你的解释。我想要实现的是将正确的响应返回给视图控制器,以便重定向(如果成功)或发出警报(如果错误)。在这种情况下,我总是会得到一个空的错误,因为它总是首先返回错误场景 –
只需更改流程:捕获用户信息,然后通过Firebase调用创建用户。在闭包内部,你可能会有一个错误(检查错误代码的原因),并告诉用户错误*或*没有错误,所以你可以继续显示下一个viewController或下一步是什么。应该是大约6行代码,并且可以在没有调度队列和回调的情况下完成。 – Jay