Моя проблема в том, что мне нужно выяснить, был ли наблюдатель .value уже присоединен к определенному узлу в базе данных Firebase Realtime. Прямо сейчас я делаю следующие шаги:
- Создание запроса на узле rootReference.advertisementsAttending.userId, из которого я получаю словарь пар ключ-значение [advertisingId: advertisingTimestamp] для всех рекламных объявлений (на самом деле AdvertisingIds), которые посещает определенный пользователь.
- Я зацикливаю полученный словарь и для каждого рекламного идентификатора прикрепляю наблюдателя события значения к узлу rootReference.advertisements.advertisingId, чтобы получить все данные рекламного объявления.
- Я помещаю рекламные объявления в словарь (advertisementsDictionary), который я позже использую для заполнения collectionView
Все работает просто отлично. Однако, когда пользователь бронирует новое объявление (скажем, с другого устройства), будет инициирован первоначальный запрос (шаг 1.). Цикл (2.) будет снова запущен. Когда это происходит, я хочу присоединить наблюдатель события .value, если его нет в rootReference.advertisements.advertisingId, чтобы избежать нескольких наблюдателей на одном узле.
Я пытался добиться этого, сохраняя пары «ссылка-дескриптор» в словаре [ссылка: дескриптор], и перед подключением наблюдателя я проверяю, есть ли в словаре ключ, равный ссылке. Если нет, я присоединяю наблюдателя и в то же время добавляю пару ключ-значение в словарь
Однако, похоже, это не работает. Когда цикл запускается во второй раз, я прикрепляю наблюдателей ко всем рекламным объявлениям, даже к тем, у которых наблюдатели были раньше.
Итак, мой вопрос: есть ли другой способ проверить, подключен ли наблюдатель к определенному узлу, чтобы я не добавил несколько слушателей?
Мой код выглядит следующим образом:
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
}
}
})