我需要从Firebase数据库读取数据并将数据插入到结构中,稍后我将对其进行一些操作。我现在面临的问题是,由于Firebase以异步方式管理这些事情,当我检查结构内部时,它通常是零并且还没有填充数据。
我知道在我实际做的事情中使用异步块之外的值是错误的,回调可以用来解决我的问题。我在网上看了很多例子,但我无法弄清楚如何在我的代码中实现它们。
为简单起见,在下面的示例中,我只从数据库中下载了一个对象。
func fetchJSON(key: String) -> Void {
var meal = Meal()
let ref = rootRef.child(key)
ref.observe(.value) { (snap: DataSnapshot) in
meal.firstMeal = snap.childSnapshot(forPath: "first").value as! String
meal.secondMeal = snap.childSnapshot(forPath: "second").value as! String
meal.thirdMeal = snap.childSnapshot(forPath: "third").value as! String
}
self.meals.append(meal)
}
这就是函数调用的样子:
fetchJSON(key: currentDate)
有人可以帮助我吗?
答案 0 :(得分:0)
您可以使用completionHandler,先在班级中声明typealias
typealias completion = (_ isFinished:Bool) -> Void
然后将 completionHandler 添加到您的函数中:
func fetchJSON(key: String, completionHandler: @escaping completion){
var meal = Meal()
let ref = rootRef.child(key)
ref.observe(.value) { (snap: DataSnapshot) in
meal.firstMeal = snap.childSnapshot(forPath: "first").value as! String
meal.secondMeal = snap.childSnapshot(forPath: "second").value as! String
meal.thirdMeal = snap.childSnapshot(forPath: "third").value as! String
}
meals.append(meal)
completionHandler(true)
}
然后像这样调用你的函数:
fetchJSON(key: currentDate, completionHandler: { (isFinished) in
if isFinished {
// do Somthing
}
})
答案 1 :(得分:0)