Как и просили в комментариях, я поделюсь своей реализацией для этой проблемы здесь:
Я создал трекер prefetchState
, который определяет, выполняю ли я предварительную выборку в данный момент или нет:
enum PrefetchState {
case fetching
case idle
}
var prefetchState: PrefetchState = .idle
Затем я подключил делегат представления прокрутки (представление прокрутки, в котором находится мое представление коллекции) к контроллеру представления и реализовал метод scrollViewDidScroll
:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
guard scrollView == self.scrollView else { return }
let prefetchThreshold: CGFloat = 100 // prefetching will start 100pts above the bottom of the scroll view
if scrollView.contentOffset.y > scrollView.contentSize.height-screenBounds.height-prefetchThreshold {
if prefetchState == .idle {
prefetchItems()
}
}
}
Там выЯ вижу, что я проверяю, нет ли уже предварительной загрузки.Если нет, я звоню prefetchItems()
, как здесь реализовано:
func prefetchItems() {
guard prefetchState == .idle else { return }
prefetchState = .fetching
someDownloadFuncWithCompletionBlock { (newItems) in
self.dataSource += newItems
self.collectionView.reloadData()
self.prefetchState = .idle
}
}