我正在尝试在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!
}
}
答案 0 :(得分: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
}
这不完全是您想要的,但它仍然简化了通话,同时更清楚地表明该通话是异步的。