Ios 接收具有自定义起点的有限查询

Ios 接收具有自定义起点的有限查询,ios,swift,firebase,firebase-realtime-database,chat,Ios,Swift,Firebase,Firebase Realtime Database,Chat,我正在用swift for iOS和firebase实时数据库构建一个基本的聊天应用程序。 观察消息时,限制至少为10。 现在,我想实现加载早期发送消息的功能。目前,我正试图通过使用以下函数来实现这一点: let query = threadRef.child("messages").queryOrderedByKey().queryStarting(atValue: "2").queryLimited(toLast: 2) 将返回此查询: (/vYhNJ3nNQlSEEXWaJAtPLhik

我正在用swift for iOS和firebase实时数据库构建一个基本的聊天应用程序。 观察消息时,限制至少为10。 现在,我想实现加载早期发送消息的功能。目前,我正试图通过使用以下函数来实现这一点:

let query = threadRef.child("messages").queryOrderedByKey().queryStarting(atValue: "2").queryLimited(toLast: 2)
将返回此查询:

(/vYhNJ3nNQlSEEXWaJAtPLhikIZi1/messages {
   i = ".key";
   l = 2;
   sp = 2;
   vf = r;
})
这应该给我提供数据:

query.observeSingleEvent(of: .value, with: { (snap)  in
但它只是限制查询,而不是将起点设置为特定位置

以下是firebase数据库结构:

messages
   -Kgzb3_b26CnkTDglNd8
     date: 
     senderId: 
     senderName: 
     text: 
   -Kgzb4Qip6_jQdKRWFey
   -Kgzb4ha0KZkLZeBIaxW
   -Kgzb577KlNKOHxsQo9W
   -Kgzb5cqIVMhRmU019Jf

有人知道如何实现这样的功能吗?

好的,我终于找到了一种方法来实现我想要的功能。 首先,我误解了从Firebase访问数据的方法。 下面是我获取查询的方式:

let indexValue = messages.first?.fireBaseKey
let query = messageRef.queryOrderedByKey().queryEnding(atValue:indexValue).queryLimited(toLast: 3)
1) 获取我以前保存到自定义聊天信息中的FireBase密钥

2) 构造查询:

  • 按键订购
  • 将结尾设置为最早的消息
  • 将要查询的数组限制为所需长度
然后,为了实际获取我使用的查询:

 query.observeSingleEvent(of: .value, with: { snapshot in
    for child in snapshot.children.dropLast().reversed() {
       let fireSnap = (child as! FIRDataSnapshot)
       //do stuff with data
    }
})
1) 将查询作为单个事件获取

2) 迭代子对象,我需要使用dropLast()来确保没有任何重复的消息,并将其反转以获得正确的顺序

3) 将当前子级强制转换为FIRDataSnapshot以访问数据

因为我找不到一个简单的例子,所以我想我把我的解决方案留在这里,以防其他人遇到同样的问题