[iOS] Prefetch TableView

나는 사과·2022년 4월 3일
0

iOS

목록 보기
5/11
  • UITableViewDataSourcePrefetching를 언제 써야할까?
    -> cellForRowAt이 호출되기 전에 미리 데이터를 로드를 해줘야 할 경우에 사용해주면 좋다!
    예를 들면, 수많은 셀이 있는데 각 셀마다 이미지를 서버에서 불러와야하는 경우에 처리하는 시간이 걸려서 셀은 나타났는데 이미지는 로딩되는 경우 미리 이미지를 로드시켜둘 수 있다.

먼저, 1~100까지의 숫자를 갖는 배열을 생성해 준다.
이 배열은 셀의 label에 넣어주어서 표현하면 된다.

    let arr = Array(1...100).map { "\($0)" }

처음 실행하면 다음 이미지와 같이 indexPath.row + 1 한 값들이 콘솔에 출력되고 해당 값들은 디바이스 화면에 보이는 값들이랑 동일하다.

그리고 스크롤을 해보면....한 +2개 정도는 미리 가져와 있는 것 같다.. 근데 지금은 라벨이고 속도에 지장줄만한 것들이 없어서 문제가 없어보일지도 모르지만.. 빠르게 스크롤하다보면 문제가 발생할 수도 있다..?

그럼 UITableViewDataSourcePrefetching를 사용하면 어떻게 될까?

tableView.prefetchDataSource = self // 이거 해주고

extension PrefetchViewController: UITableViewDataSourcePrefetching {

	// 이거 사용해준다
    func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath]) {

        for indexPath in indexPaths {
            print("prefectRowAt : \(indexPath.row)")
        }
    }
}

처음 12까지 보인 상태에서 스크롤하게되면 prefetchRowsAt 호출되면서 12~21까지 셀이 미리 로드되는 것을 볼 수 있다. 그 뒤로 다음 순서들의 인덱스 값을 갖고있는 셀들이 cellForRowAt, PrefetchForRowsAt 호출되는 것을 볼 수 있다.

tableView(_:cancelPrefetchingForRowsAt:) < 이런 메서드도 있는데 해당 메서드는 이전에 prefetch된 값들을 해제해주는 역할을 하는 메서드다. 위의 gif를 참고해서 보자면 스크롤 하면고 다음 prefetch가 나타나면 해당 메서드가 호출되면서 처음에 prefetch된 12나 13은 cancel 될 것 이다.

  • prefetch 성능 비교
    해당 이미지는 참고에 있는 블로그에서 가져왔습니다. 말 그대로 참고만 해주시면 좋을 것 같습니다~~

ps. 이미지를 다운받으면서 하는 예제도 해보고싶어서 유튜브 참고해서 unsplash에서 url로 다운받는 것도 해봤는데 해당 부분도 이어서 다음에 정리하도록 하려고 합니다....🫠
(혹시 미리 해보고싶으시면 아래 참고에 예제 링크 확인해주시면 됩니다!!)


참고
애플 개발자 문서
성능실험 이미지 출처 블로그
unsplash 예제 링크 - iOS Academy 유튜브

0개의 댓글