所以,我在这里偶然发现了一个喜忧参半的祝福。我的应用程序增长速度超过预期,我注意到性能开始下降。它是一种社交媒体,用户数据存储在Firebase中。在viewDidLoad上,我将用户数据解析为表视图。我有数百条记录必须从Firebase加载到设备上,现在我想限制表视图(100)中显示的用户数量。
所以,对于我的问题:
哪个是更好的性能选择?只是简单地将numberOfRowsInSection限制为100?或删除索引100后我的users数组中的所有元素?
如果这是第二种选择,我该怎么做呢?不幸的是,我最初需要存储在数组中的用户数据,所以我可以对它们进行排序,但是在排序之后,我想在某个索引之后删除数组中的每个元素。 (我知道这看起来很奇怪,我稍后会修复代码并使其更顺畅)。
谢谢!
答案 0 :(得分:3)
理想情况下,您可能希望在服务器端处理此问题。因此,当您为端点调用用户数据时,它将处理排序并且最多只返回100个项目。
如果您不想这样做并且只在两个选项之间进行选择,我建议您在排序后不要在100之后删除这些元素。这可以释放相当大量的内存,具体取决于每个对象的大小。要在100之后轻松删除项目,您可以使用:
myArray.removeRange(100..<myArray.count)
答案 1 :(得分:1)
一般来说,每当你有一个由某种昂贵的数据存储区支持的tableview或集合视图,这些数据存储区具有任意数量的条目时,无论是数据库还是REST调用或其他任何条目,你都希望对加载进行分页并获取用户滚动时的更多记录。当你转到你的Facebook Feed时,你肯定不想加载所有的Facebook帖子。仅加载最新的订阅源项,滚动视图控制器会询问服务器是否有更多数据,因此您可以无限滚动。
func refresh() {
if isLoading == false {
isEndOfData = false
currentPage = 0
loadPage(currentPage)
}
}
func loadPage(_ page: Int) {
isLoading = true
Notification.getPage(currentPage, pageSize: pageSize) { error, notifications in
//Handle API call here
}
}
func loadNextPage() {
if isLoading == false && isEndOfData == false {
currentPage += 1
loadPage(currentPage)
}
}
//MARK: UIScrollViewDelegate
extension NotificationViewController: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let currentOffset = scrollView.contentOffset.y
let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height
if (maximumOffset - currentOffset) <= GlobalConstants.paginationScrollOffset {
loadNextPage()
}
}
}