我的问题是,我需要确定.value观察器是否已经连接到Firebase Realtime数据库中的某个节点。现在,我正在执行以下步骤:
一切正常。但是,当用户正在预订新广告(例如从另一台设备)时,将触发初始查询(步骤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
}
}
})