在swift中限制阵列容量会更有效吗?

时间:2016-10-24 20:27:59

标签: ios arrays swift uitableview

所以,我在这里偶然发现了一个喜忧参半的祝福。我的应用程序增长速度超过预期,我注意到性能开始下降。它是一种社交媒体,用户数据存储在Firebase中。在viewDidLoad上,我将用户数据解析为表视图。我有数百条记录必须从Firebase加载到设备上,现在我想限制表视图(100)中显示的用户数量。

所以,对于我的问题:
哪个是更好的性能选择?只是简单地将numberOfRowsInSection限制为100?或删除索引100后我的users数组中的所有元素?

如果这是第二种选择,我该怎么做呢?不幸的是,我最初需要存储在数组中的用户数据,所以我可以对它们进行排序,但是在排序之后,我想在某个索引之后删除数组中的每个元素。 (我知道这看起来很奇怪,我稍后会修复代码并使其更顺畅)。

谢谢!

2 个答案:

答案 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()
            }
        }
    }