Swift 中的 tableView 分页

Pagination in tableView in Swift

我有一个 API 接受一个名为 "take" 的参数。在 viewDidLoad 中,我传递了 10,我得到了 10 个数据并将它们附加到我的对象数组中。我使用 scrollViewDidEndDragging 方法进行分页,如下所示。我将 takeCount 增加 10,然后再次调用我的 API 并将它们附加到我现有的数组中。问题是1。对象和 11。当我滚动到底部时,对象是相同的。我是否应该删除旧数据,但这是否违反分页逻辑?

分页代码

    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    
    if scrollView.contentOffset.y > scrollView.contentSize.height - scrollView.frame.size.height{
        
        self.takeCount += 10
        
        if self.takeCount <= self.sampleDataCountLimit{
            
            Service().fetchData(count: self.takeCount) { (result) in
                
                switch result{
                
                case .success(let cars):
                    
                    //self.carModel.removeAll(keepingCapacity: false)
                    self.carModel.append(contentsOf: cars)
                    
                    DispatchQueue.main.async {
                        
                        self.tableView.reloadData()
                        print(self.carModel.count)
                        print(self.carModel)
                    }
                    
                case .failure(let error):
                    
                    print(error.localizedDescription)
                }
            }
        }
        
        
    }
}

当您使用 take=20 参数调用 API 时,它只是 return 的前 20 项,而这 20 项也包含与 API 将 return 与 take=10。因此,当您将新结果附加到之前的结果时,您会得到重复的项目,因为您之前的结果已经包含新结果中的一些项目。这意味着您每次调用 API 时都需要用新数据替换旧数据,以避免项目重复。

分页通常不会那样工作。 API 通常应该接受一个范围(类似于 start=10&end=20)或页码(可选的页面大小,例如 pagesize=10&pagenumber=2)。

你应该检查你的 API 是否支持类似的东西。

或者,如果 returned 项目的数量永远不会很大,您可以选择完全不使用分页并在一个请求中获取所有项目。

如果项目的数量可以很大,但是你的API只能return前N个项目,你可能会保持逻辑,先取前N个项目,然后2N 项,然后 3N 等等,每次都完全替换数据,但这远非理想。