Проблема с извлечением данных из Firebase с использованием.Значение/.Дочерний элемент, добавленный в swift

#ios #swift #firebase #firebase-realtime-database

#iOS #swift #firebase #firebase-realtime-database

Вопрос:

я работаю над проектом, в котором я извлекаю данные из firebase (который находится в «очереди»). По сути, данные сохраняются с отметкой времени, поэтому при их вызове их можно упорядочивать последовательно (первый вход, первый выход).

Проблема, с которой я сталкиваюсь, заключается в том, что я извлекаю данные из своего приложения. Из моих исследований, посвященных переполнению стека, а также документам firebase, .Value создает снимок и продолжает прослушивать данные при добавлении новых данных. Однако при добавлении новых данных будет создан новый снимок всего набора (следовательно, «дублирование данных» в массиве моего приложения).

Чтобы обойти это, я попытался вместо этого использовать.ChildAdded, который хорошо работает для добавления новых данных в мой массив при добавлении новых данных в базу данных firebase. Однако он не добавляет полный набор данных (данные, которые уже существуют в базе данных), что мне нужно в дополнение к добавляемым новым данным.

Предположим, что узлы firebase как таковые:

 App_Queue:
         Category1:
                        Timestamp1:
                                  Uid: User_1_uid
                         Timestamp2:
                                   Uid: User_2_uid
  

Код Swift (2.3):

Случай1:

 self.databaseRef.child("App_Queue/(Category1)").queryLimitedToLast(15).observeEventType(.Value, withBlock: { (snapshot) in
                if let userDict = snapshot.value as? [String:AnyObject]{
                    for each in userDict{

                        let timeIdExtract = each.0 as! String 

                        self.timeIdArray.append(timeIdExtract)
                        print(self.timeIdArray)
                    }

//this gives me full snapshot of time stamps amp; a userId
          //but if timestamp3 and user_3_uid is added to firebase, the array is appended with a new snapshot thus, duplicating items.
  

Случай2:

 self.databaseRef.child("App_Queue/(Category1)").queryLimitedToLast(15).observeEventType(FIRDataEventType.ChildAdded, withBlock: { (snapshot : FIRDataSnapshot) in
                if let userDict = snapshot.value as? [String:AnyObject]{
                    for each in userDict{

                        let timeIdExtract = each.0 as! String // Every follwers ID.

                        self.timeIdArray.append(timeIdExtract)
                        print(self.timeIdArray)
                    }

           //this gives me only new items added, but not already added. 
          // if timestamp3 and user_3_uid is added the array is appended with this new item. But timestamp1 amp; timestamp2 not added
  

Случай 3:
Я попробовал гибрид Case1 (вместо этого используйте .observeSingleEventOfType()) amp; Case2, добавив self.databaseRef.removeAllObservers() после кода в случае 1, а затем включив .Наблюдатель с добавлением дочерних элементов для случая 2. Это почти работает …. добавлен первоначальный снимок через case 1, затем прослушивается, однако, если, скажем, недавно добавлена временная метка2, она добавит это снова при вызове Case2, таким образом дублируя массив.

Итак, мой вопрос: как, черт возьми, мне получить существующие объекты в базе данных И добавить новые, без дублирования данных в массиве?

Редактировать

Я глупый — после блока был какой-то посторонний код, который сбивал с толку. ОГО! Для всех, у кого возникли проблемы, сначала проверьте! также .ChildAdded в паре с observeEventType сделал свое дело. (принимает все предыдущие данные, уже имеющиеся в БД добавляет новые данные по мере их поступления).

 self.databaseRef.child("App_Queue/(Category1)").queryLimitedToLast(15).observeEventType(.ChildAdded, withBlock: { (snapshot) in
...
  

Ответ №1:

Я глупый — после блока был какой-то посторонний код, который сбивал с толку. ОГО! Для всех, у кого возникли проблемы, сначала проверьте! также .ChildAdded в паре с observeEventType сделал свое дело. (принимает все предыдущие данные, уже имеющиеся в БД добавляет новые данные по мере их поступления).

 self.databaseRef.child("App_Queue/(Category1)").queryLimitedToLast(15).observeEventType(.ChildAdded, withBlock: { (snapshot) in
...
  

Комментарии:

1. Я сталкиваюсь с аналогичной проблемой, как и вы — я получаю первый пакет существующих данных с помощью вызова observeSingleEvent /.value, затем я получаю дубликаты данных с помощью вызова observate /.ChildAdded из первого завершающего блока. Теперь второй вызов возвращает ВСЕ данные, поэтому я получаю двойные данные при загрузке контроллера.

2. Я не уверен, что произошло (Firebase для меня новая, но кажется, что она ведет себя немного неожиданно), но на данный момент я отказался от первого вызова, и только при использовании observe/.ChildAdded. Т.Е. больше нет observeEventType /.value, таким образом, я не получаю данные дважды при запуске.