gpt4 book ai didi

ios - 如何正确检索 firebase 数据库?

转载 作者:搜寻专家 更新时间:2023-11-01 05:53:32 25 4
gpt4 key购买 nike

我正在尝试从 firebase 数据库中检索数据。但是,我无法将局部变量分配给数据库的值。我正在使用以下类和方法。

class Episode {

var title: String?
var description: String?
var location: String?
var discount: String?
var star: Int?

init() {
self.title = ""
self.description = ""
self.location = ""
self.discount = ""
self.star = 0
}

这是我从数据库中提取数据的方法

func getValues() -> Episode {
let rootRef = FIRDatabase.database().reference().child("Restaurants").child("The Kafe")
let descriptionRef = rootRef.child("Description")
let discountRef = rootRef.child("Discount")
let locationRef = rootRef.child("Location")
let starRef = rootRef.child("Star")
let episode = Episode()

descriptionRef.observeEventType(.Value) { (snap: FIRDataSnapshot) in
episode.description = snap.value as? String
}
discountRef.observeEventType(.Value) { (snap: FIRDataSnapshot) in
episode.discount = snap.value as? String
}
locationRef.observeEventType(.Value) { (snap: FIRDataSnapshot) in
episode.location = snap.value as? String
}
starRef.observeEventType(.Value) { (snap: FIRDataSnapshot) in
episode.star = snap.value as? Int
print(episode.description!)
}
return episode
}

当我打印出返回的剧集的值时,它们都是空的。但是,当我在闭包本身内打印值时(例如,如果我在 obserEventType 闭包内执行 print(episode.description) ,它工作正常。但如果我在外面打印它是空的。

我想我缺少一些关于 swift 或 firebase 的基本知识。我是 iOS 编程的新手,所以非常感谢任何帮助。

最佳答案

只有在第一个观察者中你会得到值,返回值永远是 nil,这是因为只有返回值试图以同步方式工作,而 firebase 总是以异步方式工作

rootRef.observeEventType(.Value, withBlock: {(snap) in
let ep: Dictionary<String,AnyObject?> = [
"title": snap.childSnapshotForPath("Title").value as? String,
"description": snap.childSnapshotForPath("Description").value as? String,
"location": snap.childSnapshotForPath("Location").value as? String,
"discount": snap.childSnapshotForPath("Discount").value as? String,
"star": (snap.childSnapshotForPath("Star").value as? NSNumber)?.integerValue,
]
//Here you have your data in your object
episode = Episode(key: snap.key, dictionary: ep)
})

rootRef.observeEventType(.Value) { (snap: FIRDataSnapshot) in
print(snap.childSnapshotForPath("Title").value as? String)
}

return episode!

此外,如果您想从类似的函数中获取它,您应该使用 observeSingleEventType。

您需要重新考虑代码流,因为您希望 firebase 在始终异步时同步工作。您拥有 getValues 函数的方式将永远行不通。

要解决此问题,您应该阅读有关 async execution and callbacks in swift 的内容。

关于ios - 如何正确检索 firebase 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37604565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com