ios - 如何获取按时间戳排序的消息

标签 ios swift firebase firebase-realtime-database

我想按创建日期(即时间戳)获取所有消息。

我的数据结构是这样的:

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/

相关文章:

ios - 在 Swift 中将图像从 Firebase 添加到 TableView 单元格

ios - iOS 图表,从图表中隐藏 map

javascript - 为什么我的代码在await 语句之后不执行?

android - 拒绝类 com.google.firebase.database.FirebaseDatabase 因为它未通过编译时验证

ios - 平滑 MKPolyline 跟随道路

iphone - iOS 6 : UITableView Edit and Autoresizing

ios - 在 iOS 6 中将 5112225.14 转换为 5,112,225.14

ios - 预期返回 'UITableViewCell' 的函数中缺少返回值

ios - 覆盖 UISearchBar 的 TextField

java - Android studio firebase - 使用 UID 访问用户信息