Youngminah/TIL

Pagination

Youngminah opened this issue · 0 comments

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을 구현할 수 있는 함수.
  • 스택오버플로우에 따르면 용량이 큰 데이터나 퍼포먼스에 부담이 될 수 있는 작업에 효과적이라고 함