分页函数获取的数据超过了第一个触发器所需的数据



我在一个练习应用程序中实现分页,基本上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: nn(self.eventData)")
case .failure(let error):
print("nError decoding JSON: nn(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()
}
}

我在哪里出了问题,我该如何解决这个问题,使它只获得一个页面,然后等待用户再次到达底部,然后再获得一个,等等?

您缺少几条正确分页的信息。首先,正如您已经发现的,当您有一个挂起的请求时,您需要一个isLoading标志来防止多个请求。其次,您需要一个pageSize,应该将其传递到您的请求中。第三,你需要有一个hasMoreData标志,它最初是true,当你得到一个项目少于pageSize的结果时,它会被设置为false(即,如果我要求25个项目,而我得到5个,那么我必须在最后一页,所以hasMoreData应该被设置为false(。

在提取的顶部放置一个防护装置,以防止提取,除非你没有加载并且你有更多的数据:

guard hasMoreData && isLoading == false else { return }

最新更新