queryOrdered не всегда возвращает данные в tableViewCell в правильном порядке - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь упорядочить данные на странице уведомлений от новых к старым, основываясь на отметке времени, прямо сейчас - когда я запускаю их, иногда они находятся в правильном порядке, но в других случаях они случайные и неправильные.Пожалуйста, дайте мне знать, если я могу что-нибудь добавить, чтобы убедиться, что все работает нормально, заранее спасибо:)

Моя структура JSON в Firebase:

"notifications" : {
  "BlP58dSQGCUBwhst91yha43AQu42" : {
    "-LeNCQJ6nUSR1263iKyj" : {
      "from" : "FRuuk20CHrhNlYIBmgN4TTz3Cxn1",
      "timestamp" : 1557331817,
      "type" : "true"
    },
    "-LeNCRwNpNaXm2qhYPpu" : {
      "from" : "FRuuk20CHrhNlYIBmgN4TTz3Cxn1",
      "timestamp" : 1557331824,
      "type" : "true"
    },
    "BlP58dSQGCUBwhst91yha43AQu42-FRuuk20CHrhNlYIBmgN4TTz3Cxn1" : {
      "from" : "FRuuk20CHrhNlYIBmgN4TTz3Cxn1",
      "timestamp" : 1557331811,
      "type" : "false"
    }
  },

Мой код:

func observeNotification(withId  id: String, completion: @escaping (Notifications) -> Void) {
    REF_NOTIFICATION.child(id).queryOrdered(byChild: "timestamp").observe(.childAdded, with: { snapshot in
        if let dict = snapshot.value as? [String: Any] {
            let newNoti = Notifications.transform(dict: dict, key: snapshot.key)
            completion(newNoti)
        }
    })
}

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

Затем функция вызывается в NotificationViewController следующим образом:

func loadNotifications() {
    guard let currentUser = Api.User.CURRENT_USER else { return }
    Api.Notification.observeNotification(withId: currentUser.uid , completion: { notifications in
        guard let uid = notifications.from else { return }
        self.fetchUser(uid: uid, completed: {
            self.notifications.insert(notifications, at: 0)
            self.tableView.reloadData()
        })
    })
}

и loadNotifications () вызывается в viewDidLoad

ОБНОВЛЕНИЕ:

Попытка сделать это, используя "for child in snapshot.children", но на странице уведомлений больше ничего не отображается

func observeNotification(withId  id: String, completion: @escaping (Notifications) -> Void) {
    REF_NOTIFICATION.child(id).observe(.value, with: { snapshot in
        for child in snapshot.children {
            let snap = child as! DataSnapshot
            let key = snap.key
            let notificationOrder = self.REF_NOTIFICATION.child(key).queryOrdered(byChild: "timestamp")

            notificationOrder.observeSingleEvent(of: .value, with: { snapshot in
                if let dict = snapshot.value as? [String: Any] {
                    print(dict)
                    let newNoti = Notifications.transform(dict: dict, key: snapshot.key)
                    completion(newNoti)
                }
            })
        }
    })
  }
}

1 Ответ

0 голосов
/ 09 мая 2019

DataSnapshot, который вы получаете от Firebase, содержит три типа информации:

  1. Ключ каждого дочернего элемента, соответствующего запросу.
  2. Значение каждого дочернего элемента, соответствующего запросу.
  3. Порядок, в котором дочерние элементы являются результатом запроса.

При преобразовании всего результата в словарь (dict = snapshot.value as? [String: Any]) остается только место для ключей и значений. Так что порядок детей теряется.

Чтобы сохранить порядок дочерних узлов, выполните цикл обработки результатов запроса snapshot.children, как показано в документации по , прослушивая списки данных с событием value .

...