firebase ios snapshot.childrenCount返回默认值0而不是数据库值

时间:2017-11-21 21:17:34

标签: ios swift firebase firebase-realtime-database

我写了这段代码:

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

感谢您的帮助!

1 个答案:

答案 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分钟才能使用您的应用。