使用Firebase .childAdded时无回调的Swift技术问题排查
解决Firebase .childAdded仅初始化时触发的问题
我来帮你拆解下问题原因,再给出针对性的解决方案:
问题根源
你当前代码里的queryLimited(toFirst: 100)是关键问题——这个查询会在初始加载时返回channels节点下最早创建的100条记录。而Firebase默认按节点key的字典序排序,我们通常用push()生成的记录key是时间戳格式(比如-Nxxxxxxxxx),这类key会比旧记录的key更大,所以新增的记录根本不会被包含在queryLimited(toFirst:100)的结果范围内,自然不会触发.childAdded回调。
而.value事件会拉取整个channels节点的全部数据,所以能感知到所有新增记录,但这显然不符合你只想关注单条新增数据的需求。
解决方案
根据你的需求,分两种场景给出修正后的代码:
场景1:监听所有新增记录(无初始数量限制)
如果不需要限制初始加载的记录数,直接移除queryLimited(toFirst:100)即可,这样每次新增记录都会触发.childAdded:
var databaseRef = Firebase(url: "<MY_PROJECT_URL>") databaseRef.child("channels").observe(.childAdded, with: { snapshot in print("New Message input by user: \(snapshot.key)") })
场景2:初始加载最近100条,之后监听新增记录
如果需要初始加载最新的100条记录,同时后续新增的记录也能触发回调,改用queryLimited(toLast:100)并配合默认的key排序(契合push ID的时间顺序):
var databaseRef = Firebase(url: "<MY_PROJECT_URL>") databaseRef.child("channels") .queryOrderedByKey() .queryLimited(toLast: 100) .observe(.childAdded, with: { snapshot in print("New Message input by user: \(snapshot.key)") })
这样初始会加载最新的100条记录,之后任何新增的记录(key更大)都会进入查询结果,自动触发.childAdded回调。
额外适配说明
如果你的channels节点不是用Firebase自动生成的push ID作为key,而是自定义的排序字段(比如用createdAt存储时间戳),那需要调整排序规则:
// 假设用`createdAt`字段记录创建时间 databaseRef.child("channels") .queryOrdered(byChild: "createdAt") .queryLimited(toLast: 100) .observe(.childAdded, with: { snapshot in print("New Message input by user") })
内容的提问来源于stack exchange,提问作者Ignacio Oroná
相关产品推荐
相关产品推荐

