Firebase 使用 .value 观察者获取数据不起作用

Posted

技术标签:

【中文标题】Firebase 使用 .value 观察者获取数据不起作用【英文标题】:Firebase fetch data using .value observer is not working 【发布时间】:2020-06-22 06:57:45 【问题描述】:

当我尝试在观察者中使用 .value 时出现此错误

线程 1:致命错误:在展开可选值时意外发现 nil


     @objc func load_data()
        
        Database.database().reference().child("Food").observe(.value) (snapshot: DataSnapshot) in
        
              if let dict = snapshot.value as? [String: AnyObject]
                for child in snapshot.children 
              let FoodimageText = dict["image"] as! String
              let FoodnameText = dict["name"] as! String
              let FoodpriceText = dict["price"] as! String
                
              let post = FoodModel(FoodimageText: FoodimageText , FoodnameText: FoodnameText , FoodpriceText: FoodpriceText)
              

                self.foodlist.append(post)
                self.tableview_controller.reloadData()
                
                
            
            
            
        
          
        

[![在此处输入图片描述][1]][1]

【问题讨论】:

在 Stack Overflow 上,不要显示代码或文本的图片。将代码复制到问题本身并对其进行格式化,以便于阅读、复制和搜索。 知道了。感谢告知 【参考方案1】:

您的类型转换失败。您在访问字典字段时使用了强制类型转换(as!),如果您实际请求字典中不存在的字段/键,它将返回 nil 并且类型转换为 String 会失败,就像您一样在那里经验,或者其中一个字段/键实际上不能类型转换(如果有这样一个词)到字符串类型。希望这对您有所帮助...

提示:您最好在 for 循环之外调用 tableView 重新加载数据。

如果不看看你的数据库现在是什么样子,很难给你一个可靠的答案。

【讨论】:

我不是它无法从 firebase 中找到字段 您还必须使用 child[“image”] 而不是 dict[“image] ,这适用于您尝试通过 dict 访问的所有键。【参考方案2】:

在此处使用 Child 而不是 dict 并且不要在循环外使用强制解包和重新加载数据

@objc func load_data()
        
        Database.database().reference().child("Food").observe(.value) (snapshot: DataSnapshot) in
        
              if let dict = snapshot.value as? [String: AnyObject]
                for child in dict.values 
             if let FoodimageText = child["image"] as? String,
              let FoodnameText = child["name"] as? String,
              let FoodpriceText = child["price"] as? String 
                
              let post = FoodModel(FoodimageText: FoodimageText , FoodnameText: FoodnameText , FoodpriceText: FoodpriceText)
              
                  self.foodlist.append(post)

                  
               
                
                
              self.tableview_controller.reloadData()
            
            
            
        
          
        

【讨论】:

我收到此错误:“NSEnumerator.Element”(又名“Any”)类型的值没有下标 我解决了这个问题,将 for child in snapshot.children 替换为 for child in dict.values 我还有一个问题。它将更改的数据添加到以前的数据中 你需要把.value改成.childAdded 我得到一个空的 tableview

以上是关于Firebase 使用 .value 观察者获取数据不起作用的主要内容,如果未能解决你的问题,请参考以下文章

访问嵌套的 firebase 值

如何观察 Firebase 实时数据库的变化

Firebase 观察者实际上做了啥?

如何通过在 swift 中实现观察者从 Firebase 实时数据库中获取嵌套数据

观察调用不更新字典值。异步的问题

Swift -Firebase 可以同时发布和观察