如何检查价值事件观察器是否已经连接到Firebase节点?

时间:2019-06-24 07:42:35

标签: swift firebase

我的问题是,我需要确定.value观察器是否已经连接到Firebase Realtime数据库中的某个节点。现在,我正在执行以下步骤:

  1. 在节点rootReference.advertisementsAttending.userId上进行查询,从中我获得特定用户参加的所有广告(实际上是adsIds)的键-值对字典[advertisementId:AdvertiseTimestamp]。
  2. 我循环获取的字典,并为每个adsId在节点rootReference.advertisements.advertisementId处附加一个值事件观察器,以便获取广告的所有数据。
  3. 我将广告放入字典(advertisementsDictionary)中,稍后我将其用于填充collectionView

一切正常。但是,当用户正在预订新广告(例如从另一台设备)时,将触发初始查询(步骤1)。然后将再次触发循环(2.)。发生这种情况时,我只想在rootReference.advertisements.advertisementId不存在.value事件观察者的情况下附加一个事件观察者,以避免在同一节点上出现多个观察者。

我试图通过将参考-句柄对保存在字典中来完成此操作[reference:handle],并在附加观察者之前,我检查字典是否具有等于参考的键。如果没有,我将附加观察者,同时将一个键值对添加到字典observerDictionary [reference] = handle中。

但是,这似乎不起作用。当第二次触发循环时,我会将观察者附加到所有广告上,即使那些具有以前观察者的广告也是如此。

所以我的问题是:是否有另一种方法来检查观察者是否已经连接到某个节点,从而避免添加多个侦听器?

我的代码如下:

rootReference.child("advertisementsAttending").child(currentUser.userId).queryOrderedByValue().observe(.value, with: { (dataSnapshot) in
    for keyValuePair in dataSnapshot.children {
        let childSnapshot = keyValuePair as! DataSnapshot
        let advertisementId = childSnapshot.key
        let advertisementReference = rootReference.child("advertisements").child(advertisementId)
        let advertisementReferenceHandle: UInt!

        // Check if observer already is attached to advertisementReference
        if observerDictionary[advertisementReference] == nil {
            advertisementReferenceHandle = advertisementReference.observe(.value, with: { (advertisementSnapshot) in
                let advertisement = Advertisement()
                advertisement.populateAdvertisementFromSnapshot(snapshot: advertisementSnapshot)
                advertisementsDictionary[advertisement.advertisementId] = advertisement
                // Populating collectionView ...
            })

            // Add key-value pair to observerDictionary
            observerDictionary[advertisementReference] = advertisementReferenceHandle
        }
    }
})

0 个答案:

没有答案