从异步函数为变量赋值

问题描述 投票:0回答:1

我试图在Bool类型的String类中添加一个变量,如果在userName上用作String,则应检查Firebase,如果用户名存在则返回true,否则返回false。最后我打算像这样使用它:

username.isUserNameAvailable

问题是我的Firebase函数异步返回数据。因此,在我的函数中,变量isTaken在从函数返回变量可用性后被赋值。有没有办法来解决这个问题?

fileprivate extension String {
    var isUserNameAvailable : Bool {
        var availability : Bool?
        DatabaseManager.system.isUserNameTaken(userName: self, completion: {(isTaken) in
            availability = !isTaken
            print("isTaken = \(isTaken)")
        })
        print("availability = \(availability)")
        return availability!
    } 
}
swift string firebase asynchronous closures
1个回答
2
投票

您不应该尝试将异步调用视为已经可用的内容。

我建议有一个方法在Firebase请求完成时调用代码块。像这样的东西:

fileprivate extension String {
  func isUserNameAvailable(completion: (Bool)->()) {
    DatabaseManager.system.isUserNameTaken(userName: self, completion:{(isTaken) in
      completion(!isTaken)
    })
  }
}

你会这样称呼它:

string.isUserNameAvailable { (available) in
  //use the variable
}

它并不完全是您想要的,但它仍然简化了呼叫,同时更清楚地表明呼叫是异步的。

© www.soinside.com 2019 - 2024. All rights reserved.