Firebase observeEventType .childAdded并不像承诺的那样工作

时间:2017-06-08 20:37:53

标签: ios swift firebase firebase-realtime-database observers

当我在viewcontroller中调用此observe函数时,.childadded会立即返回已存储的对象,而不是像.childadded那样只添加bin会怀疑。

func observe(callback: RiderVC){
    let ref = DBProvider.Instance.dbRef.child("rideRequests")
    ref.observe(DataEventType.childAdded) { (snapshot: DataSnapshot) in
    if let data = snapshot.value as? NSDictionary {
    let drive = cabRide(ritID: ritID, bestemming: bestemming, 
     vanafLocatie: vanaf, taxiID: taxiID, status: status)
    print(drive)
    callback.alertForARide(title: "Wilt u deze rit krijgen?", message: "Van: \(vanaf), Naar: \(bestemming)", ritID: ritID)
    }
  } 
}

当我使用.childchanged尝试此功能时,我只会在它改变时发出警告,但在执行.chiladded时,它只会从数据库中获取所有请求,那些要求已经存在。

当我添加新请求时,它也会发出警报。所以它有效,但我怎样才能摆脱未添加的已经存在的请求?

有人知道这个漏洞吗?

1 个答案:

答案 0 :(得分:0)

这完全符合承诺。来自文档:

  

检索项目列表或侦听项目列表的添加项。   此事件将针对每个现有子项触发一次,然后再触发一次   每次将新子项添加到指定路径时。听众是   传递了一个包含新孩子数据的快照。

一开始看起来很奇怪,但这通常是大多数开发人员想要的,因为它基本上是一种从数据库中的特定分支请求所有数据的方式,即使将来会添加新项目。 / p>

如果您希望它按照您描述的方式工作,那么在应用启动后您只在数据库中获取新项目时,您需要自己做一些工作。首先,您需要为要添加到数据库的对象添加时间戳。那么你会想要在那些要求通过这些时间戳查询数据库的地方进行某种调用。它可能看起来像这样:

myDatabaseRef.queryOrdered(byChild: "myTimestamp").queryStarting(atValue: <currentTimestamp>)
祝你好运!