You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Swift 如何读取childByAutoId生成节点下的全部存储数据

问题排查与修复方案

核心问题1:列表刷新时机错误

Firebase Realtime Database的数据读取是异步操作,你当前把self.favList.reloadData()写在observe回调的外部,会出现数据还没从服务端拉取完成、数组还没赋值就先刷新了列表的情况,自然看不到数据。你需要把刷新操作放到回调的最后,等数组赋值完成后再执行。

核心问题2:强制解包风险

你代码中多处使用!强制解包可选值,一旦对应节点不存在itemName字段、或者节点结构异常,会直接触发崩溃,需要替换为安全的可选绑定写法。

修复后代码

func retrieveItems() {
    guard let userId = Auth.auth().currentUser?.uid else { return }
    let ref = Database.database().reference().child("users/\(userId)/Favourited")
    
    ref.observe(.value, with: { [weak self] (snapshot) in
        guard let self = self else { return }
        self.favUsers.removeAll()
        
        guard snapshot.childrenCount > 0 else {
            print("not yet")
            // 没有数据也要刷新列表清空旧展示
            self.favList.reloadData()
            return
        }
        
        for likes in snapshot.children.allObjects as! [DataSnapshot] {
            // 安全解包节点数据和字段
            guard let likesObject = likes.value as? [String: Any],
                  let itemName = likesObject["itemName"] as? String else {
                continue
            }
            let likesList = Names(id: likes.key, itemName: itemName)
            self.favUsers.append(likesList)
        }
        // 所有数据遍历完成后再刷新列表
        self.favList.reloadData()
    }) { error in
        // 可选添加错误监听,排查权限/路径错误
        print("数据读取失败:\(error.localizedDescription)")
    }
}

额外排查点

如果修改后还是拿不到数据,可以按以下顺序排查:

  • 确认数据库路径是否正确,你当前路径是users/用户ID/Favourited,需要和你数据库的根节点结构完全匹配,注意大小写拼写
  • 确认数据库的读写权限配置,是否允许已登录用户读取自己的收藏节点
  • 确认当前登录的用户ID和数据库中存储的用户ID一致

内容的提问来源于stack exchange,提问作者noobcoderSwift

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:27:04