Pagination
Youngminah opened this issue · 0 comments
Youngminah commented
UITableView 에서 Pagination을 하는 3가지 방법
- Swift 5.1기준
1. scrollViewDidScroll
- 스크롤을 아래로 내릴 때 더 이상 내려갈 곳이 없는 경우 데이터를 추가
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let height: CGFloat = scrollView.frame.size.height
let contentYOffset: CGFloat = scrollView.contentOffset.y
let scrollViewHeight: CGFloat = scrollView.contentSize.height
let distanceFromBottom: CGFloat = scrollViewHeight - contentYOffset
if distanceFromBottom < height {
// 데이터 추가
}
}
- 아주아주 예전부터 쓰던 고전적인 방법으로, 작동 방식이 확실하지만
- 스크롤을 빠르게 내릴 때 약간의 딜레이가 있는 것처럼 느껴질 수도 있다.
2. TableView willDisplayCell
- TableView Willdisplay Cell 이라는 함수가 있어요. 하지만, 이 방법은 권장되는 방법은 아닌 것 같다.
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if indexPath.row > dataList.count - 5 {
// willDisplay 만으로는 cell이 screen에 보여졌다고 보장되지 않음.
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
if tableView.visibleCells.contains(cell) {
//데이터 추가
}
}
}
}
3. TableView PrefetchRow 활용
- delegate 함수는 iOS10 부터 생김.
- tableview.prefetchDataSource = self 로 대리자를 위임해 줘야한다.
func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath]) {
for indexPath in indexPaths {
if dataList.count == indexPath.row {
// 데이터 추가
}
}
}
- 서버 통신과 같은 비동기 상황에서 자연스럽게 pagination을 구현할 수 있는 함수.
- 스택오버플로우에 따르면 용량이 큰 데이터나 퍼포먼스에 부담이 될 수 있는 작업에 효과적이라고 함