我需要从 Firebase 数据库读取数据并将数据插入到结构中,稍后我将在该结构上执行一些操作。我现在面临的问题是,由于 Firebase 以异步方式管理这些事情,当我检查结构内部时,它通常是 nil 并且尚未填充数据。
我知道像我实际上所做的那样使用异步 block 之外的值是错误的,并且可以使用回调来解决我的问题。我在网上阅读了很多示例,但我不知道如何在我的代码中实现它们。
为了简单起见,在下面的示例中,我只从数据库下载一个对象。
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)
有人可以帮我吗?
最佳答案
对于 Firebase,您还可以找到方便的 Promise。我用PromiseKit图书馆,它工作得很好。
你可以这样做:
fetchJSON(key: currentDate).done { meal in
print(meal)
}
func fetchJSON(key: String) -> Promise<Meal> {
let ref = rootRef.child(key)
return Promise { seal in
ref.observe(.value) { (snap: DataSnapshot) in
guard let firstMeal = snap.childSnapshot(forPath: "first").value as! String,
let secondMeal = snap.childSnapshot(forPath: "second").value as! String,
let thirdMeal = snap.childSnapshot(forPath: "third").value as! String {
let meal = Meal(firstMeal: firstMeal,
secondMeal: secondMeal,
thirdMeal: thirdMeal)
seal.fulfill(meal)
}
}
}
}
关于swift - 如何等待异步任务结束 - Swift 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50264169/