代码之家  ›  专栏  ›  技术社区  ›  Swifty

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

  •  0
  • Swifty  · 技术社区  · 8 年前

    我正在为我的应用程序做一个功能,允许用户使用他们的电子邮件注册。我正在使用Firebase,我想使用 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 */
    }
    

    现在,我的问题很清楚了;回调函数运行 异步 因此 errorMessage.count 将等于 0 当我们到达 如果 语句,因为回调函数正在另一个线程上运行。

    期望的行为: 我想我的UI线程挂起等待,直到回调函数被调用,这样,如果电子邮件已经在数据库中,它可以被检测到。我想找到一个优雅的方法来做这件事(不知道什么好的做法是在这种情况下)。是的,我可以在那里放置一个计时器来猜测回调何时完成执行,但这将是一种非常可怕的方式(因为这个回调的执行时间取决于与Firebase的连接)。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Frank van Puffelen    8 年前

    获取提供者可能需要调用后端服务器。因为这可能需要一些时间,所以它是异步发生的。一旦数据可用,就会调用完成处理程序。这意味着有关提供者的数据仅可用 里面 完成处理程序。因此,如果您需要提供程序或错误消息,那么您的代码必须在完成处理程序中。

    例如:

    func submitEmail(){

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