我试图在BoL类型的字符串类中添加一个变量,如果使用用户名作为字符串,则应该检查FielBASE,如果用户名存在,则返回true,如果不是,则返回true。最后,我打算这样使用它:

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!
    }
}

最佳答案

您不应该试图将异步调用视为已经可用的东西。
我建议在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
}

这并不完全是您想要的,但它仍然简化了调用,同时更清楚地显示了调用是异步的。

09-20 10:31