我正在实践应用程序中实现分页,基本上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()
}
}
我在哪里出问题了,如何解决这个问题,使它只获得一页,然后等待用户再次到达底部,然后再等一遍,等等?
答案 0 :(得分:0)
您缺少一些信息以正确分页。首先,由于您已经发现,您需要一个isLoading
标志来阻止有待处理请求时的多个请求。其次,您需要有一个pageSize
,您应该将其传递到您的请求中。第三,您需要有一个hasMoreData
标志,该标志最初为true,并且当您返回的结果少于pageSize
的结果时将其设置为false(即,如果我要25个项,我得到5 ,那么肯定是我在最后一页上,因此hasMoreData
应该设置为false)。
除非您没有加载并且有更多数据,否则在获取的顶部放置一个保护以防止获取:
guard hasMoreData && isLoading == false else { return }