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를 지원하는데 필요하다고 한다.
UITableViewDataSourcePrefetching
프로토콜을 채용한 객체 생성과 prefetchDataSource
프로퍼티를 tableView에 할당한다.tableView(_:prefetchRowsAt:)
구현에서의 지정된 인덱스에서 셀에 필요한 데이터의 비동기 로딩을 시작한다.tableView(_:cellForRowAt:)
메서드에서 셀에 prefetech된 데이터를 출력할 준비한다.tableView(_:cancelPrefetchingForRowsAt:)
메서드에서 더이상 테이블뷰를 생성하는데 데이터가 필요하지 않다고 하면 대기 중인 데이터 로드 작업을 취소한다.tableView(_:prefetchRowsAt:)
메서드는 테이블 뷰에서 모든 셀에서 호출될 필요는 없다. tableView(_:cellForRowAt:)
메서드 구현에서 3가지 상황에 대처할 수 있어야 한다.
1. 데이터는 prefetch 요청에 의해 로드되고 화면에 출력될 준비가 되야 한다.
2. 데이터는 prefetch 되고 있지만 아직 사용할 수 없다.
3. 데이터가 아직 요청되지 않았다.
모든 위의 상황을 대처하기 위해서는 Operation
객체 생성해 prefetch메서드 안에 저장하고 사용해 각 열의 데이터를 로드해야한다. 이 부분은 비동기적으로 접근하면 쉽게 해결될 수 있다고 한다.