Swift 4使用.childAdded从Firebase数据库获取首个键无输出的问题
如何用.childAdded获取Firebase数据库的第一个键?
你遇到的问题其实是对.childAdded的工作机制理解有点偏差啦,我来给你捋清楚:
问题出在哪?
你当前的代码里,尝试从snapshot.children里取第一个元素,但**.childAdded触发回调时,传入的snapshot本身就是目标节点下的单个子节点**——第一次回调的snapshot就是数据库里的第一个子节点,根本不需要再去它的children里找。原来的写法相当于在一个子节点里找它的子元素,自然拿不到你要的内容。
修正后的代码
// 先保存观察者句柄,方便后续移除 var observerHandle: DatabaseHandle! let userMessagesRef = Database.database().reference().child("user-message").child(uid).child(userId) observerHandle = userMessagesRef.observe(.childAdded, with: { (snapshot) in // 这里的snapshot就是第一个子节点 print("第一个子节点的键:\(snapshot.key)") print("对应的数据内容:\(snapshot.value ?? "无数据")") // 如果只需要第一个节点,拿到后立刻移除观察者,避免后续子节点触发回调 userMessagesRef.removeObserver(withHandle: observerHandle) })
关键知识点
.childAdded的触发逻辑:监听某个节点时,它会先把该节点下所有已存在的子节点按顺序逐个触发回调,之后有新子节点添加时也会触发。所以第一次回调就对应第一个子节点。- 如果只需要获取第一个节点,一定要记得移除观察者,否则后续有新数据或者其他子节点还会不断触发回调。
- 额外排查点:确认
uid和userId的路径正确,数据库对应路径下有数据,且Firebase规则允许当前用户读取该路径(权限不够的话回调不会触发)。
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

