从 Firebase 实时数据库解包数据时失败

Fail while unwrapping data from Firebase Realtime Database

提问人:ValehJr 提问时间:10/29/2023 最后编辑:Frank van PuffelenValehJr 更新时间:10/29/2023 访问量:43

问:

我正在做一个项目,我需要从我的实时数据库中获取虚构餐厅的数据。我在我的代码中添加了一个 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 中的数据是这样存储的:

Firebase data structure

我想在我的 collectionView 中显示它们,但正如我之前所说,它打印“无法解开......”

Swift Firebase Firebase -实时数据库

评论

0赞 workingdog support Ukraine 10/29/2023
你能给我们看看你得到的印刷品吗?exact
0赞 ValehJr 10/29/2023
我的所有类别都失败了。下面是打印语句结果:Failed to unwrap values for restaurant with key: italian;无法解开 restaurant 的值,键为:indian;无法解开 restaurant 的值,键为:american;无法解开 restaurant 的值,键:法语;无法解开 restaurant 的值,键为:mexican;无法使用键解开餐厅的值:日语;无法使用键解开餐厅的值:chinese;
0赞 workingdog support Ukraine 10/29/2023
只是猜测也许你得到了一系列词典,[[String: Any]]
0赞 ValehJr 10/29/2023
不幸的是没有工作:(
1赞 soundflix 10/29/2023
在 Firebase 中,“restaurants”和 restaurant 数组之间有一个节点“american”。

答:

0赞 Frank van Puffelen 10/29/2023 #1

正如 soundfix 所评论的那样,在我们进入实际餐厅的属性之前,有两个动态级别:restaurants

  1. 有,可能有一些关于美食的东西。american
  2. 有一个值,一个所谓的推送键,通常通过调用 Firebase 的 or 方法生成。-N...childByAutoIdpush

您的代码只处理其中一个动态级别(使用 ),但您需要为这两个级别设置这样的循环。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
👍 --- 如果这种方法有效,一旦系统允许,请不要忘记接受我的回答。另请参阅当有人回答我的问题时,我该怎么办?