collectionview에서 특정 셀이 탭 되었을 때 자동적으로 커지는 기능을 구현해보고 싶었다.
셀이 커지면 더 많은 데이터가 보여지는 구성으로 만들어보자! 라고 생각했는데 이 과정이 참 오래 걸렸다.
단순하게 생각했을 때는 didSelectItem에 조건을 달아서 탭이 되었을 때와 아니었을 때의 값을 sizeforitemat에 전달하면 될 것이라고 생각했다. 이 방법으로 셀이 커지기는 했지만, 주변에 있는 남은 셀들의 규격이 달라지지는 않았다. 더불어 collectionviewdelegateFlowLayout을 직접 설정해주어야만 변경이 되는 모습이 아쉬웠는데, 특히 cell의 크기가 바뀌는 애니메이션이 가장 마음에 걸렸다.
생각했던 모습은 cell이 탭 되었을 때 커지는 모습이 보이면서 주변 cell이 모두 값을 변동하는 구조로 생각을 했다. 하지만 지금은 cell을 탭하면 collectionview 자체가 '새로고침' 되는 것마냥 모든 데이터가 리로드 되었다. 그러다보니 의도했던대로 커진 셀이 만들어지지만, 뭔가 부자연스러운 느낌을 버릴 수 없었다.
이 문제는 항상하던 collectionview.reloadData() 때문에 일어나고 있던 문제였다는 것을 추후에 알게 되었는데, performBatchUpdate라는 것을 배우면서 해결하게 됐다.
이름만 읽었을 때는 '전체적인 변경 사항을 적용하는' 느낌으로 이해하게 됐다.
하지만 공식 문서를 읽다보니 서로 다른 성질을 가진다는 점을 알게 됐다.
performBatchUpdate의 경우, 하나의 에니메이션 블록에 아이템이나 섹션을 담거나 지울 수 있었는데 - 여러 변경 사항을 한번에 적용하기 위해 사용되는 메서드였다. 가장 쉬운 예로는 여러 데이터를 한번에 담거나 지울 때 사용된다고 한다.
반대로 reloadData의 경우, 데이터를 새로고침하는 메서드이다. 현재 데이터를 삭제하고 화면 내 존재하는 모든 셀, header, footer을 재생성하는 과정을 거친다고 한다. 가장 큰 차이점은 새로 생성한다는 점이었는데, 데이터 모델에 변경이 생겼을 때 혹은 데이터 자체가 변경되었을 때 reloadData()를 호출하는게 맞다고 한다.
PerformBatchUpdate는 하나의 작업에 여러 개의 에니메이션을 적용할 수 있게 된다.
collectionview의 레이아웃, 데이터가 올바르지 않다면 reloadData()가 호출이 되는데 - 이 상황을 피하기 위해선 데이터 모델은 update block 안에서 업데이트하거나 performBatchUpdate 메서드를 호출하기 전에 데이터가 제대로 업데이트 될 수 있도록 만들어두면 된다.