Firebase:观察childAdded返回现有/旧记录?

时间:2016-11-08 22:12:58

标签: swift firebase firebase-realtime-database

我有一个查询(用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)
    })

我的数据库如下所示:

enter image description here

我希望它能听到所有新来的订单。但是,每次最初加载时,它都会获取一堆现有的订单,这不是我想要的。

我在每个订单上都有一个created_at(一个表示该时间的int,例如1478637444000),所以如果有一个可以利用它的解决方案也是如此。

我的查询有问题吗?

2 个答案:

答案 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