我在一个练习应用中实现分页,基本上 scrollViewDidScroll 测量用户在页面上的位置,当他们到达底部时,我有一个 fetchMoreData 函数触发。此函数使用字符串插值从 API 中获取下一页结果。
但是我遇到了一个问题 - 当用户第一次到达页面底部时,页面会一遍又一遍地递增 - 我的打印语句显示它快速连续地进入第 2、3、4 页, 5,6等无穷无尽。
这是现在的分页代码:
func fetchMoreEvents() {
page += 1
let seatGeekApiUrl = URL(string: "https://api.seatgeek.com/2/events?venue.state=NY&page=\(page)&client_id=MTM5OTE0OTd8MTU0MjU2NTQ4MC4z")!
fetchData(url: seatGeekApiUrl) { (result: FetchResult<Welcome>) -> (Void) in
switch result {
case .success(let object): self.eventData.append(contentsOf: object.events)
//print("\neventData: \n\n\(self.eventData)")
case .failure(let error):
print("\nError decoding JSON: \n\n\(error)")
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
print("\nFetching next batch of events: (Page \(page))\n")
}
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
let height = scrollView.frame.size.height
let contentYoffset = scrollView.contentOffset.y
let distanceFromBottom = scrollView.contentSize.height - contentYoffset
if distanceFromBottom < height {
fetchMoreEvents()
}
}
我在哪里出错了,我该如何解决这个问题,以便它只获得一页,然后等待用户再次到达底部,然后又一页,等等?
Best Answer-推荐答案 strong>
您缺少一些信息来正确分页。首先,正如您已经发现的那样,您需要一个 isLoading 标志来防止在有待处理请求时出现多个请求。其次,您需要有一个 pageSize ,您应该将其传递到您的请求中。第三,您需要有一个 hasMoreData 标志,该标志最初为 true,当您返回的项目少于 pageSize 的结果时设置为 false(即,如果我要求 25 items,我回来5,那么一定是我在最后一页,所以hasMoreData 应该设置为false)。
在您的 fetch 顶部放置一个守卫以防止 fetch 除非您没有加载并且您有更多数据:
guard hasMoreData && isLoading == false else { return }
关于ios - 分页功能在第一次触发时获取比必要更多的数据,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/53523075/
|