无法从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
相关产品推荐
相关产品推荐

