分页功能可在首次触发时获取比所需更多的数据

时间:2018-11-28 15:38:14

标签: ios swift

我正在实践应用程序中实现分页,基本上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()
    }
}

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

1 个答案:

答案 0 :(得分:0)

您缺少一些信息以正确分页。首先,由于您已经发现,您需要一个isLoading标志来阻止有待处理请求时的多个请求。其次,您需要有一个pageSize,您应该将其传递到您的请求中。第三,您需要有一个hasMoreData标志,该标志最初为true,并且当您返回的结果少于pageSize的结果时将其设置为false(即,如果我要25个项,我得到5 ,那么肯定是我在最后一页上,因此hasMoreData应该设置为false)。

除非您没有加载并且有更多数据,否则在获取的顶部放置一个保护以防止获取:

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