对于大型数据集,是否建议在 cellForRowAtIndexPath 上调用 Web 服务?

Is it advisable to call Web Services on cellForRowAtIndexPath for large datasets?

如果数据集太大,我想在 table 视图上显示数据。最好的方法应该是什么?

第一种方法- 我在 cellForRowAtIndexPath 中调用 API。这将在我每次滚动时发出请求,这意味着一次又一次地点击该服务。也许我也可以缓存数据,但我仍然认为这不是最好的方法。

第二种方法- 首先,将所有数据保存在本地,然后显示。这将意味着占用更多的内部存储空间。

哪种方法更好或是否有更好的方法可用?

你会采取什么方法取决于你的API是否支持分页!如果 API 不支持分页,那么您别无选择,只能一次检索所有内容并将其显示在 tableView 中。

如果你的 API 支持分页,那么你可以在 ViewDidLoad 中调用加载第一页,然后执行 scrollViewDidScroll 委托来检查用户何时滚动到底部table/collectionView 并触发网络服务获取下一页响应。这将一直持续到服务器返回空数组为止。

这是一个简单的 scrollViewDidScroll 覆盖,您可以使用它来确定用户是否到达 tableView/collectionView

的末尾
extension ViewController : UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let bottomEdge = scrollView.contentSize.height + scrollView.contentInset.bottom - scrollView.bounds.height
        if scrollView.contentOffset.y >= bottomEdge {
            //make a webservice call now
        }
    }
}

创建太多连接不是一个好主意。

您应该获得所有这些并在一个页面中显示几个项目。

但是由于数据太多,你有两个选择。将它们结合起来作为第三种选择更好。

  1. 不显示任何数据,实现搜索栏,请求带有搜索文本的数据。现在您根据搜索文本请求了数据的子集。

  2. 请求数据子集(例如前 20 个)并实现 load more 按钮(您也可以使用 scrollview 的委托代替按钮)或 pagination.

如果响应有图片链接,您应该下载cellForRowAtIndexpath 中的图片。如果您之前开始下载它们,用户将等待太多。