1 Вопрос: queryOrdered не всегда возвращает данные в tableViewCell в правильном порядке

вопрос создан в Wed, May 8, 2019 12:00 AM

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

Моя структура 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)
        }
    })
}

Edit:

Затем функция вызывается в 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

UPDATE:

Попытка сделать это, используя "для дочернего элемента в 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)
                }
            })
        }
    })
  }
}
    
0
  1. Куда вы звоните observeNotification?
    2019-05-08 19: 09: 13Z
  2. Я добавил изменение, чтобы показать, где оно вызывается:)
    2019-05-09 13: 39: 49Z
1 ответ                              1                         

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

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

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

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

    
0
2019-05-09 01: 22: 44Z
  1. Привет, Фрэнк, признателен за ответ. Это ново для меня, так что это может быть глупый вопрос, но я добавил обновление в свой код, чтобы попытаться следовать этому методу, но теперь на моей странице уведомлений ничего не отображается - можете ли вы сказать мне, что я могу делать неправильно?
    2019-05-09 15: 03: 41Z
источник размещен Вот