【问题标题】:Using the current timestamp to query all post before that time使用当前时间戳查询该时间之前的所有帖子
【发布时间】:2017-06-19 00:21:28
【问题描述】:

我保证读起来很容易:)

你好,我现在卡住了。我想先查询从最新帖子开始的所有帖子,而不是最旧的帖子。为什么?因为这是我可以在 tableView 中包含分页的唯一方法。 (这意味着当用户到达底部时重新加载)

假设我有 10 个帖子,从最早的 #1 和最新的 #10 开始:1,2,...,10 如果我查询限于前 5 个帖子,我得到 [1,2,3,4,5] 然后我反转数组,这将显示 [5,4,3,2, 1] 在我的 tableview 上从 5 开始。

ISSUE:问题是一旦用户到达tableview的底部,如果我从最后一个帖子的时间戳开始查询接下来的五个帖子,我会得到...... [6,7,8,9,10]

但现在我的表格视图不再正确,因为它会显示 [5,4,3,2,1,10,9,8,7,6] 我希望如果我可以使用当前设备日期作为时间戳并查询之前的所有帖子,如下所示:我基本上可以获得 [10,9,8,7,6] 然后当用户到达底部:[10,9,8,7,6,5,4,3,2,1]

让今天时间:TimeInterval = NSDate().timeIntervalSince1970

          FIRDatabase.database().reference().child("post").child(animal).queryOrderedByValue().queryEnding(atValue: todayTime, childKey: "datePost").queryLimited(toLast: 5).observe(.value, with: {(snapshot) in

【问题讨论】:

  • 只需将您的时间戳写为负值,其他一切都会到位。我写了一个对另一个可能有帮助的问题的答案Negative Firebase Timestamp
  • 首先感谢您的回复!但是,呵呵,您的答案非常复杂-我无法将时间戳设为负值,因为它们是在 firebase 上制作的?您是否暗示您在上一篇文章中的回答是我查询在 Firebase 上制作的时间戳,然后将其设为负数?抱歉,不是以英语为母语的人
  • 如另一个答案中所述,您无法直接从 Firebase 获取时间戳(在代码中),但是在写入时(根据我的回答中提供的代码),您可以观察它所写入的节点它将为您提供快照中的时间戳。然后,您可以将其设为负数(在代码中)并将其写入需要排序的节点。对于负时间戳,排序将通过该时间戳节点进行,并且自然会按照正确的顺序排列,最新的在“顶部”。所以顺序将是 -10(最新)、-9、-8....-1。所以你读 -10 到 -5,然后 -4 到 -1 等等。
  • 嘿,Jay,很抱歉打扰,但正如您在评论中所说,我遇到了这部分的问题 [ 所以顺序将是 -10(最新),-9,-8....- 1.所以你读 -10 到 -5,然后 -4 到 -1 等等。]stackoverflow.com/questions/44682240/…

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


【解决方案1】:

给定以下结构

messages
  msg_0
    msg: "oldest message"
    timestamp: -1
  msg_1
    msg: "hello"
    timestamp: -4
  msg_2
    msg: "hello"
    timestamp: -2
  msg_3
    msg: "newest message"
    timestamp: -5
  msg_4
    msg: "hello"
    timestamp: -3

还有下面的代码

let messagesRef = self.ref.child("messages")
let queryRef = messagesRef.queryOrdered(byChild: "timestamp")
queryRef.observe(.childAdded, with: { snapshot in
    let key = snapshot.key
    print(key)
})

输出将是

msg_3 <-newest message
msg_1
msg_4
msg_2
msg_0 <-oldest message

如您所见,msg_3 是最新消息,出现在“顶部”,即它是查询接收到的第一个快照。如果您正在填充要用作数据源的数组,这将添加到索引 0,然后 msg_1 将添加到索引 1 等等。

如果用户滚动并且您想要加载接下来的 5 个,它将是时间戳 6 到 10,其中 10 是最新的。

现在假设您要加载最旧的两条消息。这是查询

let queryRef = messagesRef.queryOrdered(byChild: "timestamp")
                          .queryStarting(atValue: -3, childKey: "timestamp")
                          .queryEnding(atValue: -1, childKey: "timestamp")

结果

msg_2
msg_0

然后,我们要加载下一个最旧的两个

let queryRef = messagesRef.queryOrdered(byChild: "timestamp")
                          .queryStarting(atValue: -5, childKey: "timestamp")
                          .queryEnding(atValue: -3, childKey: "timestamp")

这给了我们

msg_1
msg_4

显然,我用 -5、-4 等代替实际时间戳,但它的工作方式相同。

【讨论】:

  • 嘿,杰伊,事情是我不知道 结束值 是什么,呵呵呵呵...我尝试使用当前时间,甚至只是简单地 1 没有成功?最后最后最后一个提示
  • @24hrcoder 如果答案有帮助,请接受答案,以便对他人有所帮助!
  • 是的,抱歉,我多次尝试点赞,但它显示“少于 15 次代表的投票已记录,但不会更改公开显示的帖子得分”
猜你喜欢
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 2013-01-16
  • 2014-03-05
相关资源
最近更新 更多