Swift 如何检查值事件观察者是否已连接到Firebase节点?

Swift 如何检查值事件观察者是否已连接到Firebase节点?,swift,firebase,Swift,Firebase,我的问题是,我需要找出.value观察器是否已连接到Firebase实时数据库中的某个节点。现在,我正在执行以下步骤: 在节点rootReference.advertisementsAttending.userId上进行查询,从中我得到一个键值对的字典[advertisementId:advertisementTimestamp],用于某个用户参与的所有广告(实际上是advertisementId) 我循环获取的字典,对于每个advertisementId,我在节点rootReference.A

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

  • 在节点rootReference.advertisementsAttending.userId上进行查询,从中我得到一个键值对的字典[advertisementId:advertisementTimestamp],用于某个用户参与的所有广告(实际上是advertisementId)
  • 我循环获取的字典,对于每个advertisementId,我在节点rootReference.Advertises.advertisementId处附加一个值事件观察器,以便获得广告的所有数据
  • 我将广告放在字典(advertisementsDictionary)中,稍后我将使用该字典填充collectionView
  • 一切正常。但是,当用户预订新广告(比如从另一台设备)时,将触发初始查询(步骤1)。然后将再次触发循环(2)。发生这种情况时,如果rootReference.advisions.advisementId中不存在.value事件观察者,我只希望附加一个.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
            }
        }
    })
    

    添加和删除观察者是相当简单的,所以有一个答案,但看看代码,您通常可能走错了路。当你可能只需要一个观察者时,你似乎正在添加很多观察者。你能稍微扩展一下你的用例吗?为什么要在特定节点上添加特定观察者?此外,您正在使用.value observer,如果有任何更改,它将加载节点中的所有内容。您可能希望研究一个更精细的解决方案,使用.childAdded、.childChanged和.childRemoved事件,这些事件只显示修改后的节点。添加和删除观察者非常简单,因此有一个答案,但查看代码,您通常可能走错了路。当你可能只需要一个观察者时,你似乎正在添加很多观察者。你能稍微扩展一下你的用例吗?为什么要在特定节点上添加特定观察者?此外,您正在使用.value observer,如果有任何更改,它将加载节点中的所有内容。您可能希望研究一种更精细的解决方案,其中.childAdded、.childChanged和.childRemoved事件只显示修改后的节点。