我正在为我的应用程序提供一项功能,以允许用户使用他们的电子邮件进行注册。我正在使用Firebase,并且想使用Firebase API中的fetchProviders()
。
这是我到目前为止所拥有的:
func submitEmail() {
var errorMessage = [String()]
Auth.auth().fetchProviders(forEmail: email) { (providers, error) in
if let error = error {
print(error.localizedDescription)
} else if let providers = providers {
errorMessage.append("Error - email already in use")
print(errorMessage) // prints "Error - email already in use"
}
}
print(errorMessage) // prints []
if errorMessage.count > 0 {
/* show alert */
}
现在,我的问题很清楚了;回调函数异步运行,因此当我们进入 if 语句时,errorMessage.count
等于0
,这仅仅是因为回调函数正在另一个线程上运行
期望的行为: 我希望我的UI线程挂起,直到调用回调函数为止,这样,如果数据库中已经有电子邮件,则可以将其检测到。我想找到一种优雅的方式(不确定这种情况下的良好做法)。是的,我可以在其中放置一个计时器,以猜测回调何时完成执行,但这将是一种非常可怕的方式(因为此回调的执行时间取决于与Firebase的连接)。
答案 0 :(得分:0)
获取提供者可能需要调用后端服务器。由于这可能需要一些时间,因此它是异步发生的。数据可用后,将调用完成处理程序。这意味着有关提供程序的数据仅在完成处理程序内 中可用。因此,如果您需要提供程序或错误消息,则代码必须位于该完成处理程序中。
例如:
func commitEmail(){ var errorMessage = [String()]
Auth.auth().fetchProviders(forEmail: email) { (providers, error) in
if let error = error {
print(error.localizedDescription)
} else if let providers = providers {
errorMessage.append("Error - email already in use")
print(errorMessage) // prints "Error - email already in use"
}
if errorMessage.count > 0 {
/* show alert */
}
}