问题描述
我有一个 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 时,它只返回前 20 个项目,并且这 20 个项目还包括 API 使用 take=10
返回的相同项目。因此,当您将新结果附加到之前的结果时,您会得到重复的项目,因为您之前的结果已经包含了新结果中的一些项目。这意味着您每次调用 API 时都需要用新数据替换旧数据,以避免项目重复。
分页通常不会那样工作。 API 通常应接受范围(类似于 start=10&end=20
)或页码(可选地带有页面大小,例如 pagesize=10&pagenumber=2
)。
你应该检查你的 API 是否支持类似的东西。
或者,如果返回的项目数量永远不会很大,您可以选择完全不使用分页并在一个请求中获取所有项目。
如果项目数量可能很大,但您的 API 只能返回前 N 个项目,那么您可能会保留先获取前 N 个项目,然后是 2N 个项目,然后是 3N 个的逻辑以此类推,每次都完全替换数据,但这远非理想。