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

无法从Firebase Realtime Database获取好友ID问题求助

问题分析与解决方案

核心问题

你的代码存在三个关键错误,导致无法正确获取好友ID:

  • 监听节点错误:你当前监听的是Users/{uid}节点,但好友数据存储在Users/{uid}/Friends节点下,监听层级不对。当你在Users/{uid}节点监听.childAdded时,触发回调的snapshot其实是Friends这个子节点,而非好友ID节点。
  • 数据类型匹配错误:你的Firebase数据结构中Friends是一个字典(键为好友ID,值为true),但代码里试图将其转为String,类型不匹配。
  • 键名错误:代码里尝试从snapshot.value的字典中取"Friends"键,但此时snapshot.value本身就是Friends节点的内容(好友ID字典),这个字典里并没有"Friends"这个键,自然取不到值。

修正后的代码

根据需求,提供两种实现方式:

方式1:一次性获取所有好友ID

如果只需要一次拉取当前所有好友,使用observeSingleEvent:

func fetchUsers() {
    let ref = Firebase.Database.database().reference()
    
    guard let userId = Auth.auth().currentUser?.uid else { return }
    
    // 直接监听Friends节点
    ref.child("Users").child(userId).child("Friends").observeSingleEvent(of: .value) { snapshot in
        // 将Friends节点的value转为字典
        guard let friendsDict = snapshot.value as? [String: Bool] else {
            print("没有好友数据或数据格式错误")
            return
        }
        // 提取所有好友ID(字典的key就是好友ID)
        let friendIds = Array(friendsDict.keys)
        print("所有好友ID:\(friendIds)")
        
        // 若User类的currentUserFriends是数组类型,可直接赋值
        // user.currentUserFriends = friendIds
    }
}

方式2:实时监听好友新增

如果需要实时监听好友的添加(新好友加入时自动获取),使用observe(.childAdded)在Friends节点:

func fetchUsers() {
    let ref = Firebase.Database.database().reference()
    
    guard let userId = Auth.auth().currentUser?.uid else { return }
    
    // 监听Friends节点下的子节点新增
    ref.child("Users").child(userId).child("Friends").observe(.childAdded) { snapshot in
        // snapshot.key就是新增的好友ID
        let newFriendId = snapshot.key
        print("新增好友ID:\(newFriendId)")
        
        // 可将新好友ID添加到已有的好友列表中
        // user.currentUserFriends?.append(newFriendId)
    }
}

额外提示

  • 确保你的User类中currentUserFriends的类型是[String](数组),而非String,因为好友ID是多个。
  • 检查Firebase数据库规则,确保当前用户有读取Users/{uid}/Friends节点的权限,否则会获取不到数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:25:38