我在过去的12个月里一直在Android上使用Firebase,并取得了成功。我刚刚切换到Swift,并尝试从我创建的同一个Firebase数据库中读取数据并使用过去12个月+。由于FB DB有安全性,我做的第一件事就是让FB身份验证(来自Swift)工作。这有效。现在,我试图让一个简单的observeSingleEvent运作起来并且正在努力。
Firebase数据库是旧的东西。它有一个root用户节点。对于初学者,我只想从用户节点读取用户。我知道身份验证正在运行,因为当我提交电子邮件和密码时,我会收到确认。当电子邮件/密码错误时,我不会得到确认。鉴于这验证了我与数据库的连接,并作为测试我在登录验证后立即粘贴了以下代码。
当我调试它时,它只是从“self.ref?.child(”users“)。observeSingleEvent ...”跳到下面的括号。即它从未承认有可用数据,但有数据可用。
为避免有人问“你需要什么?”我正在寻找的是为什么我没有收到下面代码的数据结果集的答案,因为FB DB中有数据,而且我在过去12个多月里一直在Android上读/写这些数据。
欢迎任何/所有帮助,因为我在Swift / FB 4.0上切割了
@IBAction func signInButtonTapped(_ sender: UIButton) {
// TODO: Do some form validation on the email and password
if let email = emailTextField.text, let pass = passwordTextField.text {
// Check if it's sign in or register
if isSignIn {
// Sign in the user with Firebase
Auth.auth().signIn(withEmail: email, password: pass, completion: { (user, error) in
// Check that user isn't nil
if let u = user {
// User is found, go to home screen
self.ref = Database.database().reference()
self.ref?.child("users").observeSingleEvent(of: .value, with: {( snapshot) in
let value = snapshot.value as? NSDictionary
let username = value?["username"] as? String ?? ""
print ("*** " + username)
})
}
else {
// Error: check error and show message
}
})
}
答案 0 :(得分:1)
由于observeSingleEvent是一个异步调用,因此它在后台线程上运行,这就是为什么当你在self.ref上放置一个断点时它跳转到下一个括号,因为它没有阻止当前的执行线程,并且在后台线程上执行一段时间
一种方法是:
@IBAction func signInButtonTapped(_ sender: UIButton) {
// TODO: Do some form validation on the email and password
if let email = emailTextField.text, let pass = passwordTextField.text {
// Check if it's sign in or register
if isSignIn {
// Sign in the user with Firebase
Auth.auth().signIn(withEmail: email, password: pass, completion: { (user, error) in
// Check that user isn't nil
if let u = user {
// User is found, go to home screen
self.fetchUserName { fetchedUserName in
print(fetchedUserName)
}
}
else {
// Error: check error and show message
}
})
}
func fetchUserName(completionHandler: @escaping (String) -> Void) {
self.ref = Database.database().reference()
self.ref?.child("users").observeSingleEvent(of: .value, with: {( snapshot) in
//let value = snapshot.value as? NSDictionary
if let value = snapshot.value as? [String: Any] {
print(value)
let username = value["username"] as? String ?? ""
print (username)
completionHandler(username)
}
})
}