我有一个查询(用swift编写):
FIRDatabase.database().reference(withPath: "\(ORDERS_PATH)/\(lId)")
.child("orders")
.observe(.childAdded, with: { firebaseSnapshot in
let orderObject = firebaseSnapshot.value as! [String: AnyObject]
let order = AppState.Order(
title: orderObject["name"] as! String,
subtitle: orderObject["item_variation_name"] as! String,
createdAt: Date(timeIntervalSince1970: TimeInterval(orderObject["created_at"] as! Int / 1000)),
name: "name",
status: AppState.Order.Status.Pending
)
f(order)
})
我的数据库如下所示:
我希望它能听到所有新来的订单。但是,每次最初加载时,它都会获取一堆现有的订单,这不是我想要的。
我在每个订单上都有一个created_at
(一个表示该时间的int,例如1478637444000),所以如果有一个可以利用它的解决方案也是如此。
我的查询有问题吗?
答案 0 :(得分:6)
观察者总是开火一次并读入“所有数据”。
.value观察者一次读入节点中的所有内容,其中作为.childAdded观察者(来自文档)
此事件将针对每个现有子项触发一次,然后再触发一次 每次将新子项添加到指定路径时。
如果您考虑自己的问题,那么您实际需要的是所有数据的子集。这是通过查询实现的。
您的查询将是观察在某个时间戳之后发生的所有.childAdded事件。这就是你需要做的事情!
使用queryStartingAtValue(开始的时间戳)来创建一个观察查询,它将返回在该时间戳之后添加的所有子项。
答案 1 :(得分:-1)
Swift3解决方案:
只需编写多个观察员。
您可以通过以下代码检索以前的数据:
queryRef?.observeSingleEvent(of: .value, with: { (snapshot) in
//Your code
})
类型.value的observeSingleEvent只调用一次并检索所有以前的数据
然后通过以下代码观察新数据。
queryRef?.queryLimited(toLast: 1).observe(.childAdded, with: { (snapshot) in
//Your Code
})
每次有新数据可用时,都会调用queryLimited(toLast:1)并保留类型.childAdded