我写了这段代码:
func countTeacherSubstitutions() -> Int {
var count: Int = 0
database.observeSingleEvent(of: .value, with: { (snap) in
count = Int(snap.childrenCount)
print("\(snap.childrenCount) /c")
print("\(count) /t1")
})
print("\(count) /t2")
return count
}
功能应该返回4(数据库中root的子节点)而不是0(默认的firebase值)
print语句返回以下内容: “/ c:4” “/ t1:4” “/ t2:0”
指向github repo的链接(此代码尚未推送):https://github.com/bcye/teacher-substitution-schedule-app-webscraper
感谢您的帮助!
答案 0 :(得分:0)
问题在于此。
Firebase在另一个线程上运行。发生了什么事是它的说法
步骤1)count = 0
步骤2)向firebase索取信息,但是,这可能需要一些时间,所以转到下一步,我们将在完成后执行括号内的所有内容
步骤3)(在调用步骤2中的内容之前发生)返回Count(其为0)
你需要做的是直接用firebase闭包内部的count值(你打印c的值)更新你想要更新的内容,或者发送一个完成处理程序来处理count的值什么时候完成。
一个例子可能是这个
func countTeacherSubstitutions(completion: (Int) -> Void){
database.observeSingleEvent(of: .value, with: { (snap) in
count = Int(snap.childrenCount)
completion(count)
})
}
从任何地方都这样调用上面的内容。
let completion = { (count: Int) in
//I don't know what you do with count, but for this example ill update a label
label.text = "\(count)"
}
countTeacherSubstitutions(completion: completion)
这里实质上发生的是你告诉它你想要运行的代码,一旦它做了它做的事情,即从服务器获取数据。如果没有这个,如果从服务器获取数据需要2分钟,那么您必须等待2分钟才能使用您的应用。