반응형
collectionView 사용 시, cell을 구성하기 위해 dataSource function 중 하나인 cellForItemAt을 사용합니다.
그리고 일반적으로 이 function 안에서, 많은 양의 셀의 생성/소멸을 막아 메모리의 부담을 줄이기 위해 셀을 재사용하는 과정을 거칩니다.
이는 구성한 각 셀들이 CollectionView를 reload 할 경우, 실질적으로 다른 셀들이 될 수 있음을 의미합니다.
cellForItemAt을 통해 Cell을 구성한다면 보기에는 reload 이전과 같은 Cell로 보이지만, reload 과정에서 이전과 같은 셀을 재사용한다는 보장이 되어 있지 않기 때문입니다.
위 영상은 Timer를 통해 일정 주기로 CollectionView를 reload하며, 각 셀들의 hashValue를 출력한 결과입니다.
위 상황을 인지하지 못할 경우, 예상치 못한 결과를 초래할 수 있습니다.
예를 들어, Cell 내의 버튼 선택 시, isSelected 여부를 Cell 내에서만 처리한다면 추후 collectionView reload시 원치 않은 Cell의 버튼의 isSelected 값이 변경되어 있는 것을 볼 수 있습니다.
정리
- collectionView/tableView를 사용할 때, 현재 Cell이 reload시 같은 Cell이라는 보장을 할 수 없다.
- 따라서 가급적이면 cell 구성에 필요한 것들은 cellForItemAt/cellForRowAt 에서 하는 것이 정신 건강에 좋다.
감사합니다.
반응형
'UIKit' 카테고리의 다른 글
[UIKit] LSP 위반 케이스 (Forced Unwrapping의 위험성) (0) | 2021.06.05 |
---|---|
[UIKit] systemLayoutSizeFitting 사용 시, 주의 사항 (0) | 2020.10.29 |
[UIKit] Dynamic cell sizing - systemLayoutSizeFitting (1) | 2020.10.29 |
[UIKit] Generic Cell Configurator (3) | 2020.03.22 |
[UIKit] UITableView의 indexPathForRow(at:) 오차에 대한 디버깅 (2) | 2020.03.16 |