首先,您不能在数据库中存储某些字符是正确的。根据 Firebase 文档,(https://firebase.google.com/docs/database/ios/structure-data)
如果您创建自己的密钥,它们必须是 UTF-8 编码的,最多可以是 768 个字节,并且不能包含 .、$、#、[、]、/ 或 ASCII 控制字符 0-31 或 127 .
但是,正如您所见,“@”符号不是其中之一。至于点,您可以使用一个函数将点替换为另一个字符。例如, ”•”。这是一个例子:
func createNewEmail(oldEmail: String) -> String{
return oldEmail.componentsSeparatedByString(".").joinWithSeparator("•")
}
它的作用是将电子邮件拆分为“email@example”和“com”的数组。然后,它用新字符重新加入它们,创建“email@example•com”
如果您曾经需要旧电子邮件,您可以反过来做同样的事情。
func getOldEmail(newEmail: String) -> String{
return newEmail.componentsSeparatedByString("•").joinWithSeparator(".")
}
然后你可以像这样格式化你的树
emails:
email@example•com: UID123456789
最后,对于你原来的问题,函数可以这样写
func userLookUpByEmail (email: String) -> String {
let newEmail = createNewEmail(email)
var userID: String = "nil"
ref.child("emails").child(newEmail).observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in
if snapshot.value != nil {
print(snapshot.value)
userID = snapshot.value as! String
}
else {
print ("user not found")
userID = "nil"
}
})
return userID
}
但是,您可能每次都会得到“nil”。这是因为observeSingleEventOfType 是一个闭包。这意味着它在您的应用程序的后台运行。因此,用户 ID 可能会在闭包内更改之前返回。您可能希望在闭包内运行基于 userID 的任何代码,而不是返回 userID。例如,不要这样做:
func userLookUpByEmail (email: String) -> String {
let newEmail = createNewEmail(email)
var userID: String = "nil"
ref.child("emails").child(newEmail).observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in
if snapshot.value != nil {
print(snapshot.value)
userID = snapshot.value as! String
}
else {
print ("user not found")
userID = "nil"
}
})
return userID
}
doSomethingWith(lookUserUpByEmail(email@example.com))
你可以这样做:
func userLookUpByEmail (email: String){
let newEmail = createNewEmail(email)
var userID: String = "nil"
ref.child("emails").child(newEmail).observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in
if snapshot.value != nil {
print(snapshot.value)
userID = snapshot.value as! String
doSomethingWith(userID)
}
else {
print ("user not found")
userID = "nil"
doSomethingWith(userID)
}
})
}