【问题标题】:Firebase returns nil when fetching dataFirebase 在获取数据时返回 nil
【发布时间】:2021-11-21 17:42:25
【问题描述】:

我在获取数据时遇到问题,现在似乎可以工作了,但我不需要观察 .childAdded,而是需要观察值。

我当前的代码功能是:

    func fetchJobs() {
ref.child("jobposts").observe(.childAdded) { (snapshot) in
    
    guard let dictionary = snapshot.value as? [String:Any]  else { return}
    
    var job = JobData()
    
    job.title = (dictionary["title"] as! String) <-- Error in any of the job.*
    job.company = (dictionary["company"] as! String)
    job.city = (dictionary["city"] as! String)
    job.salary = (dictionary["salary"] as! String)
    job.creator = (dictionary["creator"] as! String)
    
    self.jobs.append(job)
    
}
}

当我将 .observe(.childAdded) 更改为 .observe(.value) 时出现错误:

 Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

有什么可能导致这种情况的想法吗?

使用 print(dictionary) 打印所有文档,也许我需要以某种方式映射它们?提前谢谢你

【问题讨论】:

  • “有什么想法会导致这种情况吗?”什么是 Firebsse?您指的是哪个服务?
  • 不,不要使用 .value 与观察节点中的每个更改一样,重新加载整个节点并且您不希望这样。您希望 .childAdded、.childChanged 和 .childRemoved 获得查找粒度的更新,以便您可以更新 tableView 数据源和 UI。请参阅我对已接受答案的评论。

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

当您观察到节点列表的 .value 事件时,您需要遍历 snapshot.children 以获取各个节点。来自listening for value events for lists的文档:

_commentsRef.observe(.value) { snapshot in
  for child in snapshot.children {
    ...
  }
}

....childAdded 侦听器中的当前代码所在的位置。

【讨论】:

  • 弗兰克,谢谢!现在似乎正在获取数据。唯一的问题是,当我手动更改数据库中的数据时,应用程序会附加一个新列表,而不仅仅是编辑旧列表的值。你知道可能是什么问题吗?
  • 没问题!您是否知道清除当前数据的确切命令?
  • @ToothFairy 补充这个答案。问题是您只使用 .childAdded ,它只会在添加孩子时通知您的应用程序。虽然清除数组很好,但您可能需要更细粒度的控制;例如,如果一个孩子发生了变化,您不需要清除列表 - 只需更新已更改的那个。这是通过 .childChanged 事件和 .childRemoved 事件完成的。所以本质上,当一个孩子被改变时,你的应用会收到一个包含改变数据的事件,包括节点键。然后,您可以在数组中找到该节点并更新它(和 UI)。
猜你喜欢
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
相关资源
最近更新 更多