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 观察者获取数据不起作用的主要内容,如果未能解决你的问题,请参考以下文章