UICollectionViewCell의 LifeCycle과 PreFetching
UIViewControleller의 LifeCyle은 한 번 정리했었지만
자주 사용하는 UICollectionViewCell이나 UITableViewCell의 LifeCycle은 인지하고 않고 있어서 한 번 정리해야 할 것 같다.
UICollectionViewCell의 LifeCycle과 PreFetching
View와 관련된 작업을 할 때, LifeCycle을 알아야 더 훌륭하게 작업을 할 수가 있다.
UIViewController는 처음 공부할 때 부터 인지하고 있어서 괜찮았지만 UICollectionViewCell같은 경우는 단순하게 Reusable만 된다는 것을 알고 LifeCycle을 공부하진 않았다.
단순히 deququeReusableCell로 cell을 만들고, 재사용을 위해서 ReuseQueue에 Enqueue, Dequeue 과정만 거친다고 알고 있었다.
UICollectionViewCell의 LifeCycle 모식도이다.
살펴보면 시작은 1. deququeReusableCell을 통해 Cell을 만들고 Configuration과정을 거친다. (이는 당연한 시작!)
그 다음 UIViewController와 비슷하게 will // did 로 시작하는 함수가 나타난다.
먼저, 2. willDisplayCell함수는 cell이 화면에 보여지기 직전에 호출된다.
Scrolling과정을 거쳐 cell이 보이지 않게 되면
3. didEndDisplayingCell함수가 호출되고 cell은 ReuseQueue에 들어가 관리가 된다.
그리고 위의 과정을 계속 반복하여 cell의 LifeCycle이 이루어진다.
UITableViewCell같은 경우는 찾아봤지만 자료가 보이지 않는다...😓
개인적인 생각으로는 둘다 Reusable의 특징을 가지고 있으니 비슷한 LifeCycle을 갖지 않을까 생각이 된다.
(각각의 Delegate 메소드 안에 위의 함수들이 정의되어 있다.)
그런데, iOS10.0부터 (한참 전..!) pre-fetch라는 기술이 도입되었다.
이 전에 작성했던 글 중에서 iOS의 update cycle은 60fps라고 했다.
그러면 UICollectionView를 사용할 때, 매끄러운 동작을 위해서는 약 16.65ms안에 프레임을 그려야한다는 의미이다.
하지만 네트워킹을 통해 받아온 무거운 이미지를 각 cell에 넣는 작업을 하다가 위 속도를 지키지 못하면
프레임드랍이 발생하고 Scrolling이 좋은 퍼포먼스를 유지하지 못한다.
그래서 pre-fetch라는 기술이 나왔다!
위의 LifeCycle에도 약간의 변화가 있다.
3. didEndDisplayingCell가 호출된 다음, 바로 ReuseQueue에 들어가지 않고 약간동안 유지된다.
이는 사용자가 바로 스크롤 방향을 바꿨을 때, 재사용하지 않고 Cell을 보여줄 수 있으므로 성능에 유리하게 된다.
그리고, 앞서 말한 PreFetching은 cell에 대한 dataSource를 미리 준비할 수 있는 기술이다.
이 기술은 UICollectionViewDataSourcePrefetching protocol에서 확인할 수 있다.
func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath])
optional func collectionView(_ collectionView: UICollectionView, cancelPrefetchingForItemsAt indexPaths: [IndexPath])
위의 두 함수가 PreFetching을 다룰 수 있는 함수이다. (각각 Required, Optional)
prefetchItemsAt은 UICollectionView가 cell을 load할 준비가 되면 자동으로 호출하고.
cell을 load하는 작업이 아닌 cell에 대한 dataSource를 준비하는 작업을 실행하는 함수이다.
cancelPrefetchingForItemsAt은 반대로 cell에 대한 준비된 dataSource를 취소하는 함수이다.
좋은기술이지만 항상 사용하는 것은 큰 의미가 없어보이고
다량의 무거운 이미지작업 혹은 네트워킹과 같이 cell을 로드하는데에 문제를 줄 상황이라면 충분히 사용할 수 있는 기술이라고 생각한다.