1 Câu hỏi: queryOrdered không luôn trả về dữ liệu trên bảngViewCell theo đúng thứ tự

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi đang cố gắng sắp xếp dữ liệu trên trang thông báo từ mới đến cũ dựa trên dấu thời gian, ngay bây giờ - khi tôi chạy nó, đôi khi nó theo đúng thứ tự nhưng lần khác là ngẫu nhiên và không chính xác. Vui lòng cho tôi biết nếu có bất cứ điều gì tôi có thể thêm vào để đảm bảo nó luôn chạy trơn tru, cảm ơn bạn trước :)

Cấu trúc JSON của firebase của tôi là:

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

Mã của tôi:

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)
        }
    })
}

Chỉnh sửa:

Hàm sau đó được gọi trong Trình thông báo như thế này:

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()
        })
    })
}

và loadNotutions () được gọi trong viewDidLoad

CẬP NHẬT:

Đang cố thực hiện bằng cách sử dụng "cho trẻ em trong snapshot.children" nhưng không có gì hiển thị trên trang thông báo nữa

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. Bạn gọi observeNotification ở đâu?
    2019-05-08 19: 09: 13Z
  2. Tôi đã thêm một chỉnh sửa để hiển thị nơi được gọi là :)
    2019-05-09 13: 39: 49Z
1 Câu trả lời                              1                         

DataSnapshot mà bạn lấy lại từ Firebase chứa ba loại thông tin:

  1. Khóa của mỗi đứa trẻ phù hợp với truy vấn.
  2. Giá trị của mỗi đứa trẻ phù hợp với truy vấn.
  3. Thứ tự mà trẻ em kết quả từ truy vấn.

Khi bạn chuyển đổi toàn bộ kết quả thành từ điển (dict = snapshot.value as? [String: Any]), chỉ có chỗ cho các khóa và giá trị. Vì vậy, trật tự của trẻ em bị mất.

Để duy trì thứ tự của các nút con, hãy lặp lại kết quả truy vấn của snapshot.children như được hiển thị trong tài liệu về lắng nghe danh sách dữ liệu với sự kiện value .

    
0
2019-05-09 01: 22: 44Z
  1. Xin chào, đánh giá cao câu trả lời của bạn. Đây là một câu hỏi mới đối với tôi vì vậy nó có thể là một câu hỏi ngu ngốc nhưng tôi đã thêm một bản cập nhật trong mã của mình để thử và làm theo phương pháp này nhưng bây giờ không có gì hiển thị trên trang thông báo của tôi - bạn có thể cho tôi biết tôi có thể làm gì sai không? /div>
    2019-05-09 15: 03: 41Z
nguồn đặt đây