OGeek|极客世界-中国程序员成长平台

标题: ios - 分页功能在第一次触发时获取比必要更多的数据 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-11 20:52
标题: ios - 分页功能在第一次触发时获取比必要更多的数据

我在一个练习应用中实现分页,基本上 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-推荐答案


您缺少一些信息来正确分页。首先,正如您已经发现的那样,您需要一个 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/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4