gpt4 book ai didi

ios - 在 Firebase 中对大量数据进行分页的最有效方法

转载 作者:行者123 更新时间:2023-12-01 19:56:12 25 4
gpt4 key购买 nike

我正在尝试为具有排名的帖子创建无限滚动(类似于 HackerNews),我想知道当有大量数据时,使用 Firebase 分页/创建无限滚动的最有效方法是什么。

我一直在做的方式是请求所有数据,对它们进行排序,然后限制滚动以创建无限滚动的感觉。有没有办法创建这个无限滚动而不必请求所有数据然后对它们进行排序?

我用这种方法看到的问题是,如果我们有 100K+ 条目,我们将不得不请求并排序 100K+ 条目,这不是很好。任何帮助将不胜感激!

最佳答案

由于排名是根据帖子创建后的时间和帖子收到的分数计算得出的值,因此您实际上只有两个选项。您可以获取所有帖子并在客户端计算排名(在您的情况下这不是一个选项),或者您可以在对帖子进行更新时计算排名。另外,我在 Swift 中给出了我的例子。

此示例的 DB 结构:

posts : {
$post: {
stats : {
score : scoreValue,
ranking : rankingValue,
createdAt : timestamp
}
}
}

具体来说,这意味着当创建新帖子时,您将为它分配默认分数并计算排名。

由于排名现在存储在数据库中,您可以使用简单地获取前 x 个帖子
postsRef.queryOrdered(byChild:"stats/ranking").queryLimited(toLast: x)

也许
ref.queryOrdered(byChild: "stats/ranking").queryEnding(atValue: "lowestScoreSoFar").queryLimited(toLast: x)

现在,为了确保帖子的排名保持最新,您只需在更新分数的同一操作(交易)中更新排名。
ref.runTransactionBlock({ (currentData: FIRMutableData) ->   FIRTransactionResult in
if var stats = currentData.value as? [String : Any] {
var score = stats["score"] as? Int
var createdAt = stats["createdAt"] as? Long
score += 1
var ranking = calculateRanking(score, createdAt)
stats["score"] = score
stats["ranking"] = ranking
currentData.value = stats
return FIRTransactionResult.success(withValue: currentData)
}
return FIRTransactionResult.success(withValue: currentData)
}) { (error, committed, snapshot) in
if let error = error {
print(error.localizedDescription)
}
}

这种方法的一个问题是,如果没有人投票,得分高的帖子将保持在顶部 float 。为了应对这个黑客新闻,他们似乎在他们的服务器上运行了一个脚本,该脚本每 30 秒更新一个随机帖子在前 x 中的排名。您必须运行服务器并查看哪种设置最适合您的特定情况。

由于如果您使用类似于 Hacker News 的算法,所有帖子的评分将朝着 0 发展,您可以尝试随机更新排名高于某个阈值的帖子的排名(这样您将忽略旧的和不相关的帖子)。

Hacker News Algorithm

More info on the algorithm

How often does Hacker News recalculate rankings

How Hacker News algorithm really works

关于ios - 在 Firebase 中对大量数据进行分页的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42620505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com