【发布时间】:2017-02-12 10:49:01
【问题描述】:
我正在使用 Firebase FirAuth API,在 API 返回结果之前,Disposables.create() 已返回并且不再可点击(我知道这可能是由于调用 API 后没有 observer.onCompleted 造成的。有没有办法等待它/听听结果?
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
}
【问题讨论】:
-
Firebase 是异步的,并非旨在以同步方式返回数据。虽然你可以强制这种模式,但它会导致很多长期问题。所有的 DispatchQueue 和回调都应该被移除,否则将是一场噩梦。让 Firebase 完成它的工作;一旦数据在 Firebase 闭包中可用,然后继续进行 UI 中的下一步,处理该数据等。代码可能过于复杂 - 也许如果你能解释你想要完成的事情,一个明确的解决方案可能是提供而不是解决方法。
-
感谢您的解释。我想要实现的是向视图控制器返回正确的响应,以便我重定向(如果成功)或发出警报(如果错误)。在这种情况下,我总是得到一个空错误,因为它总是首先返回错误场景
-
只需改变流程:捕获用户信息,然后通过Firebase调用创建用户。在闭包内,您将遇到错误(检查原因的错误代码)并告诉用户错误或没有错误,以便您可以继续显示下一个 viewController 或下一步是什么.应该是大约 6 行代码,并且可以在没有调度队列和回调的情况下完成。
标签: ios swift firebase firebase-authentication rx-swift