swift - 如何检查值事件观察者是否已附加到 Firebase 节点?
问题描述
我的问题是我需要确定 .value 观察者是否已经附加到 Firebase 实时数据库中的某个节点。现在我正在执行以下步骤:
- 对节点 rootReference.advertisementsAttending.userId 进行查询,从中我得到一个键值对字典 [advertisementId: adsTimestamp] 用于某个用户参加的所有广告(实际上是广告 ID)。
- 我循环获得的字典,并且对于每个advertisementId,我在节点rootReference.advertisements.advertisementId 处附加一个值事件观察器,以便获得广告的所有数据。
- 我将广告放在字典(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
}
}
})
解决方案
推荐阅读
- python - Django 2:url中的多个slug
- javascript - 为什么我在更新此文件时收到“输入意外结束”?
- typescript - 当我使用 react-transition-group 时,“TS7017:元素隐式具有‘任何’类型......没有索引签名”
- reactjs - 成功调用 api 后在状态中设置用户详细信息 - Redux saga
- modeling - Enterprise Architect - showing relations of inner component like it was own
- javascript - 如何复制表单 div 元素?
- c# - 为什么这个异步运行异步/线程?
- linux - 如何在 Linux 中从一个文件中搜索字符串并更新到另一个文件
- ios - Swift 将来自 Webrequest 的数据存储到结构中
- php - 将带有值的产品属性添加到 Woocommerce 中的产品