使用自定义起点接收有限查询

时间:2017-04-06 10:32:07

标签: ios swift firebase firebase-realtime-database chat

我正在使用swift为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

任何人都知道如何实现这样的功能?

1 个答案:

答案 0 :(得分:1)

好的,我终于找到了一种方法来做我想做的事。 首先,我误解了从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以访问数据

由于我无法找到一个简单的例子,所以我想我将解决方案留在这里,以免其他人遇到同样的问题。