我想按创建日期(即时间戳)获取所有消息。
我的数据结构是这样的:
messages
XRJONcahNUgeNrfkH3cmITJt3409 (auto uid of owner - user)
-KoOSxA2Iajk3kv20U_p (automatic uid generated by Firebase)
message: "Hi"
senderId: "X8Oxg5J9Imb12C1iYBXJT9P48909"
senderName: "Dave"
timestamp: 1505813320526 (automatic timestamp)
-GdOSxR2Iajk3kv20U_p --- I NEED TO SORT THESE UIDS
message: "Hello"
senderId: "G7Oxg5J9Imb12C1iYBXJT9P48909"
senderName: "Frank"
timestamp: 1505813321024 (automatic timestamp)
我收到的所有消息都是这样的:
database.child("messages").child(ownersId).observeSingleEvent(of: .value, with: { (snapshot) in
print(snapshot)
if let messagesDict = snapshot.value as? [String:AnyObject] {
for (_,message) in messagesDict {
self.messages.append((message["message"] as? String)!)
self.users.append((message["senderName"] as? String)!)
self.timestamps.append((message["timestamp"] as? IntMax)!)
}
}
completionHandler(true)
}) { (error) in
print(error.localizedDescription)
completionHandler(false)
}
那么问题来了,我怎样才能让所有消息从旧到新排序呢?我不知道在这种特定情况下如何使用排序方法(queryOrderedByKey()、queryOrderedByValue() 或 queryOrdered(byChild: "timestamp")。Firebase 以随机顺序向我发送数据(我不知道它是否是随机的,但它是未按日期排序)。
最佳答案
正如 Rashwan 所说,您需要调用 queryOrderedByChild()
以正确的顺序返回项目。然后循环遍历 snapshot.children
以确保您也以正确的顺序处理它们。
所以:
database.child("messages").queryOrdered(byChild: "timestamp").observe(.value, with: { snapshot in
for child in snapshot.children.allObjects as! [DataSnapshot] {
print("\(child.key)")
}
completionHandler(true)
})
回调中重要的是不要将整个快照转换成字典,因为字典不会维护项目的顺序。
关于ios - 如何获取按时间戳排序的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46299009/