从Firebase检索信息时,控制流如何工作?

时间:2019-02-26 16:45:21

标签: ios swift firebase firebase-realtime-database

var ergebnisBluetezeit = Set<String>()

let refBluetezeit = rootRef.child("Pflanzen").child("Eigenschaften").child("Blütezeit")
    refBluetezeit.child("Februar").observeSingleEvent(of: .value, with: { snapshot in
                    for plant in snapshot.children {
                        self.ergebnisBluetezeit.insert((plant as AnyObject).value)
                    }
                })
    print(ergebnisBluetezeit)

我想从Firebase数据库检索数据。检索过程确实已经工作了,但是以下内容使我感到困惑:打印的当前输出是一个空集,但是当我在其他地方使用var ergebnisBluetezeit(例如,设置一个按钮,该操作是打印ergebnisBluetezeit)时,它将被填充。当我将打印内容放入for循环中时,它也确实打印了正确的输出。 我似乎不了解这里的控制流程,所以我的问题是: 我该如何使用当前打印语句所在的位置集? 感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这是异步调用的逻辑

print("1") // empty
refBluetezeit.child("Februar").observeSingleEvent(of: .value, with: { snapshot in     

 print("3") // empty
 for plant in snapshot.children {
         self.ergebnisBluetezeit.insert((plant as AnyObject).value)
  }
    print(ergebnisBluetezeit) // not empty
})

print("2") // empty

在请求完成之前,该值一直为空,无论您在代码顺序中的哪个位置运行打印,如上面顺序1,2,3所示,要知道何时完成打印,都可以使用类似

的补全
func getData(completion:@escaping() -> ()) {
    let refBluetezeit = rootRef.child("Pflanzen").child("Eigenschaften").child("Blütezeit")
    refBluetezeit.child("Februar").observeSingleEvent(of: .value, with: { snapshot in
        for plant in snapshot.children {
            self.ergebnisBluetezeit.insert((plant as AnyObject).value)
        }
        completion()
    })
}

然后致电

getData {
   print(ergebnisBluetezeit)
}