我正在使用Firebase实时数据库,在特定时间执行代码时遇到麻烦。当我询问数据库中是否有特定值时,它会执行代码以检索数据,然后自动继续到下一行,而不等待数据的检索。我正在使用以下代码来检索数据:
self.ref.child("Period \(periodListValue)").child("Students").child("\(studentName)").child("Novel Author").observeSingleEvent(of: .value) { (snapshot) in
self.CurrentAuthorTextField.text = (snapshot.value as! String)
}
此代码正下方的与数据库无关的代码行,将在上述代码执行之后立即执行。这意味着我无法在上面显示的代码正下方使用该代码的任何数据库信息。
我正尽力向我解释这一点。
有帮助吗?
答案 0 :(得分:0)
好吧,您必须对以下内容使用完成处理程序:-
func ifStudentPresent(studentName: String, completionHandler: @escaping ((_ exist : Bool) -> Void))
{
self.ref.child("Period \(periodListValue)").child("Students").child("\ .
(studentName)").child(studentName).observeSingleEvent(of: .value) { (snapshot) in
if snapshot.exists(){
completionHandler(true)
}else{
print("Student Don't exist")
completionHandler(false)
}
})
}
答案 1 :(得分:0)
您可能会遇到此问题的原因与无效的数据库安全规则有关。这些可以轻松地阻止您检索所需的数据并同步实时数据库。
让我们假设您正在尝试同步ref
数据库引用。您需要设置正确的规则允许从该数据库引用中读取-类似于".read" = true"
。
[警告]请注意这些数据库安全规则。错误的规则可能导致严重的不良行为,例如人们非法从数据库中读取和/或写入数据库。 The key to firebase security - Google I/O 2016
是一个很好的视频,介绍了如何设置完美的安全规则。答案 2 :(得分:0)
let dispatch = DispatchGroup.init()
dispatch.enter()
self.ref.child("Period \(periodListValue)").child("Students").child("\(studentName)").child("Novel Author").observeSingleEvent(of: .value) { (snapshot)
in
self.CurrentAuthorTextField.text = (snapshot.value as! String)
dispatch.leave()
}
dispatch.notify(queue: .main) {
//write code here, it will execute after database fetch
}