使用 Threshold 进行预加载
原理:根据当前 UITableView 的所在位置,除以目前整个 UITableView.contentView 的高度,来判断当前是否需要发起网络请求:
let threshold: CGFloat = 0.7
var currentPage = 0
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
let current = scrollView.contentOffset.y + scrollView.frame.size.height
let total = scrollView.contentSize.height
let ratio = current / total
if ratio >= threshold {
currentPage += 1
print("Request page \(currentPage) from server.")
}
}
上面的代码在当前页已经划过了70%的时候,就请求新的资源,家在数据;但是,仅仅使用这种方法有另一个问题,尤其是当列表变得很长时,十分明显,比如说:用户从上向下滑动,总共加载了5页数据:
当Threshold设置为70%的时候,其实并不是单页70%,这就会导致新加载的页面都没有看到,应用就会发出另一次请求,后区新的资源。
动态的Thres
解决这个问题的办法,还是比较简单的,通过修改上面的代码,将 Threshold 变成一个动态的值,随着页数的增长而增长:
let threshold: CGFloat = 0.7
let itemPerPage: CGFloat = 10
var currentPage: CGFloat = 0
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
let current = scrollView.contentOffset.y + scrollView.frame.size.height
let total = scrollView.contentSize.height
let ratio = current / total
let needRead = itemPerPage * threshold + currentPage * itemPerPage
let totalItem = itemPerPage * (currentPage + 1)
let newThreshold = needRead / totalItem
if ratio >= newThreshold {
currentPage += 1
print("Request page \(currentPage) from server.")
}
}