我有一个保存 Posts 的数据库。将来,我的数据库可能会保存大量 Posts 。我不知道该怎么做,因为我无法在我目前想到的几个选项之间做出决定:
1) 一次加载所有 Posts 并将它们存储到 Posts[] 数组中,并仅在 TableView 上显示所有帖子显示它们。
2) 一次加载 10 个 Posts 并一次显示这 10 个,然后实现一个允许用户滚动并一次加载更多 10 个的功能。这 10 个加载的值随后将被添加到 TableView 。
现在,选项#1 看起来简单而有吸引力,因为它是我目前设置的。但是,我不确定每次用户打开显示 Posts 的页面时不断加载数百个帖子是否会出现问题。
选项 #2 似乎很复杂,因为我不知道如何使用 Firebase 一次仅加载 10 个 Posts 。我正在使用 .childAdded 观察来收集数据,这通常会加载所有 Posts 。我有一个可能没用也可能没用的替代想法是将所有 Posts 加载到 Posts[] 数组中,但一次只显示 10 个。这个选项很有吸引力,因为用户不必在每次查看包含帖子的 TableView 时都加载每个帖子。我也犹豫要不要选择这个选项,因为我必须大量改变我的数据结构。目前的设置是:
root/posts/post-id/post-info
其中 post-info 节点包含与帖子相关的信息,并且不包含索引,我觉得选项 #2 需要。
我被困在这里了。在这种情况下采取什么最佳措施?
Best Answer-推荐答案 strong>
我在创建类似应用程序的“论坛”时遇到了同样的问题。有很多线程,一次加载它们不是正确的方法。
如果我是你,我会坚持方法 2:加载 X 个帖子,当 TableView 滚动到底部(或几乎滚动到底部)时,加载其他帖子并显示它们。
这是一个简单的例子:
您需要一个变量来保存有关应显示多少帖子的信息:
var numberOfPosts: Int = 20
使用 queryLimited 查询您的帖子:
reference.child("child").child("child").queryLimited(toLast: UInt(numberOfPosts))
这将返回最后 X 个帖子。您还应该通过某些键对其进行排序,以确保您确实以正确的顺序发布了最新帖子:
reference.child("child").child("child").queryOrdered(byChild:"timestamp").queryLimited(toLast: UInt(numberOfPosts))
所以想法是,第一次它会加载 20 个帖子。下一次它应该加载 40,等等。这就是为什么我们需要实现一些东西来识别所有帖子都已显示并且我们需要加载新帖子。我正在使用 scrollView 功能来做到这一点 - 每次我几乎到达底部时,都会加载额外的帖子。实现scrollView didScroll :
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if (scrollView.contentOffset.y + 100) >= (scrollView.contentSize.height - scrollView.frame.size.height) {
// You have reeached bottom (well not really, but you have reached 100px less)
// Increase post limit and read posts
numberOfPosts += 20
readPosts()
}
}
如果您在同一个类中有 UITableViewDelegate,则函数应该自己工作,因为 TableView 使用 scrollView 委托(delegate)。
所以这应该足以让你继续前进。我这里没有实际代码,所以无法真正粘贴它来帮助您。
顺便说一句,我使用的是 .value 而不是 .childAdded 但无论如何你应该能够实现这样的东西。
关于ios - Firebase 分页 - Swift 和 iOS。什么时候应该使用它?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/45260148/
|