提问人:ValehJr 提问时间:10/29/2023 最后编辑:Frank van PuffelenValehJr 更新时间:10/29/2023 访问量:43
从 Firebase 实时数据库解包数据时失败
Fail while unwrapping data from Firebase Realtime Database
问:
我正在做一个项目,我需要从我的实时数据库中获取虚构餐厅的数据。我在我的代码中添加了一个 print 语句,它总是说:“无法用键解开餐厅的值”。这是我显示餐厅的功能:
func fetchRestaurantData(completion: @escaping ([Restaurants]?) -> Void) {
let ref = Database.database().reference().child("restaurants")
ref.observeSingleEvent(of: .value) { (snapshot, _) in
if snapshot.exists() {
if let data = snapshot.value as? [String: Any] {
var restaurants: [Restaurants] = []
for (key, restaurantInfo) in data {
if let restaurantData = restaurantInfo as? [String: Any] {
if let address = restaurantData["address"] as? String,
let category = restaurantData["category"] as? String,
let name = restaurantData["name"] as? String,
let rating = restaurantData["rating"] as? String,
let status = restaurantData["status"] as? String {
let restaurant = Restaurants(name: name, rating: rating, address: address, category: category, status: status)
restaurants.append(restaurant)
} else {
print("Failed to unwrap values for restaurant with key: \(key)")
}
}
}
completion(restaurants)
} else {
print("No valid data found in snapshot")
completion(nil)
}
} else {
print("No data found in the snapshot")
completion(nil)
}
}
}
firebase 中的数据是这样存储的:
我想在我的 collectionView 中显示它们,但正如我之前所说,它打印“无法解开......”
答:
0赞
Frank van Puffelen
10/29/2023
#1
正如 soundfix 所评论的那样,在我们进入实际餐厅的属性之前,有两个动态级别:restaurants
- 有,可能有一些关于美食的东西。
american
- 有一个值,一个所谓的推送键,通常通过调用 Firebase 的 or 方法生成。
-N...
childByAutoId
push
您的代码只处理其中一个动态级别(使用 ),但您需要为这两个级别设置这样的循环。for (key, restaurantInfo) in data {
所以像这样:
ref.observeSingleEvent(of: .value) { (snapshot, _) in
if snapshot.exists() {
for cuisineSnapshot in snapshot.children {
for restaurantSnapshot in cuisineSnapshot.children {
if let restaurantData = restaurantSnapshot.value as? [String: Any] {
...
您会注意到,我通过该属性遍历子节点,如 Firebase 文档中关于侦听子节点列表所示。children
评论
0赞
Frank van Puffelen
10/30/2023
👍 --- 如果这种方法有效,一旦系统允许,请不要忘记接受我的回答。另请参阅当有人回答我的问题时,我该怎么办?
评论
exact
[[String: Any]]