【问题标题】:Pagination in tableView in SwiftSwift中tableView中的分页
【发布时间】:2021-02-04 21:07:55
【问题描述】:

我有一个 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)
                }
            }
        }
        
        
    }
}

【问题讨论】:

  • 您的 API 是否返回完全不同的对象,其中 take=10 和 take=20?会不会分别返回前 10 个和前 20 个对象,这样前 10 个是前 20 个的子集?
  • @VadimBelyaev 例如,我发送了 10,然后输入 20,第十个之后出现不同的值。此外,当我打印 self.carModel.count 时,它返回 30。(这里是 API url :sandbox.arabamd.com/api/v1/…)

标签: swift xcode uitableview


【解决方案1】:

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

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

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

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

如果项目的数量可能很大,但您的 API 只能返回前 N 个项目,您可能会保留先获取前 N 个项目,然后是 2N 个项目,然后是 3N 的逻辑以此类推,每次都完全替换数据,但这远非理想。

【讨论】:

  • 您好,非常感谢您的回答。根据我的研究和一些视频,有诸如页码之类的东西。但这些在我的 API 中不可用。我找到了除了take参数之外的跳转参数,我猜它是这样工作的,你觉得这对我有用吗?网址:sandbox.arabamd.com/api/v1/…
  • 我猜我的跳过参数就像 pageNumber :(
  • 看来skiptake 的组合正是您所需要的。如果你想一次获取 10 条记录,第一页使用 skip=0&amp;take=10,第二页使用 skip=10&amp;take=10,第三页使用 skip=20&amp;take=10,以此类推。
  • 正如你所说,我同意你的看法。非常感谢您的宝贵时间。
猜你喜欢
  • 2018-08-21
  • 2016-05-23
  • 1970-01-01
  • 2016-12-02
  • 2017-06-29
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多