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 等等,每次都完全替换数据,但这远非理想。
我有一个 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 等等,每次都完全替换数据,但这远非理想。