[iOS] UITableViewDataSourcePrefetching 프로토콜

나는 사과·2021년 4월 20일
0

TIL

목록 보기
16/17

UITableView에서 DataSource와 Delegate 프로토콜말고 남은 한 가지 프로토콜인 UITableVIewDataSourcePrefetching 프로토콜이다. 프로토콜의 이름만 보면 UITableView에서 DataSource를 미리가져오는(Prefetching) 프로토콜이라는 것을 상상해 볼 수 있다. 애플 개발자 문서에서도 다음과 같이 소개하고 있다.

A protocol that provides advance warning of the data requirements for a table view, allowing you to start potentially long-running data operations early.
-> 데이터 요구사항에 대해 사전 경고를 통해 장기 실행 데이터 작업을 미리 시작하는 것을 허용하는 프로토콜이다.

tableView(_:cellForRowAt:)메서드가 호출되기 전에 데이터를 로딩한다. 개발자 문서에서 다음과 같은 단계가 tableview에서 prefetch data source를 지원하는데 필요하다고 한다.

  1. tableView와 데이터 생성한다.
  2. UITableViewDataSourcePrefetching 프로토콜을 채용한 객체 생성과 prefetchDataSource프로퍼티를 tableView에 할당한다.
  3. tableView(_:prefetchRowsAt:) 구현에서의 지정된 인덱스에서 셀에 필요한 데이터의 비동기 로딩을 시작한다.
  4. tableView(_:cellForRowAt:)메서드에서 셀에 prefetech된 데이터를 출력할 준비한다.
  5. tableView(_:cancelPrefetchingForRowsAt:)메서드에서 더이상 테이블뷰를 생성하는데 데이터가 필요하지 않다고 하면 대기 중인 데이터 로드 작업을 취소한다.

tableView(_:prefetchRowsAt:) 메서드는 테이블 뷰에서 모든 셀에서 호출될 필요는 없다. tableView(_:cellForRowAt:)메서드 구현에서 3가지 상황에 대처할 수 있어야 한다.
1. 데이터는 prefetch 요청에 의해 로드되고 화면에 출력될 준비가 되야 한다.
2. 데이터는 prefetch 되고 있지만 아직 사용할 수 없다.
3. 데이터가 아직 요청되지 않았다.

모든 위의 상황을 대처하기 위해서는 Operation객체 생성해 prefetch메서드 안에 저장하고 사용해 각 열의 데이터를 로드해야한다. 이 부분은 비동기적으로 접근하면 쉽게 해결될 수 있다고 한다.

0개의 댓글