首页 > 解决方案 > 如何检查值事件观察者是否已附加到 Firebase 节点?

问题描述

我的问题是我需要确定 .value 观察者是否已经附加到 Firebase 实时数据库中的某个节点。现在我正在执行以下步骤:

  1. 对节点 rootReference.advertisementsAttending.userId 进行查询,从中我得到一个键值对字典 [advertisementId: adsTimestamp] 用于某个用户参加的所有广告(实际上是广告 ID)。
  2. 我循环获得的字典,并且对于每个ad​​vertisementId,我在节点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
        }
    }
})

标签: swiftfirebase

解决方案


推荐阅读