var fetchingMore = false func scrollViewDidScroll(_ scrollView: UIScrollView) { let offsetY = scrollView.contentOffset.y let contentHeight = scrollView.contentSize.height if offsetY > contentHeight - scrollView.frame.height * 4 { if !fetchingMore { beginBatchFetch() } } } func beginBatchFetch() { fetchingMore = true //Load more data from server DispatchQueue.main.asyncAfter(deadline: .now() + 0.25, execute: { //Mark that job is done self.fetchingMore = false self.tableView.reloadData() }) }