如何知道fetchProviders()何时完成执行?

时间:2018-10-02 16:17:19

标签: swift firebase callback firebase-authentication

我正在为我的应用程序提供一项功能,以允许用户使用他们的电子邮件进行注册。我正在使用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的连接)。

1 个答案:

答案 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 */
    }
}