Как я могу проверить, был ли наблюдатель события-значения уже подключен к узлу Firebase? - PullRequest
1 голос
/ 24 июня 2019

Моя проблема в том, что мне нужно выяснить, был ли наблюдатель .value уже присоединен к определенному узлу в базе данных Firebase Realtime. Прямо сейчас я делаю следующие шаги:

  1. Создание запроса на узле rootReference.advertisementsAttending.userId, из которого я получаю словарь пар ключ-значение [advertisingId: advertisingTimestamp] для всех рекламных объявлений (на самом деле AdvertisingIds), которые посещает определенный пользователь.
  2. Я зацикливаю полученный словарь и для каждого рекламного идентификатора прикрепляю наблюдателя события значения к узлу rootReference.advertisements.advertisingId, чтобы получить все данные рекламного объявления.
  3. Я помещаю рекламные объявления в словарь (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
        }
    }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...