CollectionView에서 DiffableDatasource와 CompositionalLayout을 사용한 이유? - boostcampwm-2021/iOS04-OwnMyWay GitHub Wiki

문제 상황

#1

  • 홈 화면의 경우 세로 CollectionView안에 가로 스크롤이 가능한 영역이 존재해야하는 형태로 구성이 되어있습니다.
  • 이 때 특정 Section(예정된/진행중/종료된 여행 영역)의 데이터가 존재하지 않을 경우 특정 멘트를 보여주면서 Section의 높이를 변화시켜야하는 등의 Dynamic한 CollectionView를 구성해야 했습니다.

#2

  • 저희의 아키텍쳐에서는 Combine을 통해서 ViewModel의 데이터 변화를 ViewController가 감지하는 형태로 구성이 되어있습니다.
  • ViewModel의 데이터가 배열일 경우 ViewController에서 Combine sink를 통해 배열을 넘겨받게 되는데 어떤 부분에서 변화가 발생했는지 감지하는것이 어렵다는 문제가 발생했습니다.
    • 몇개가 한번에 변화했는지도 모르고 삭제의 경우 어떤 index가 삭제된 것인지 감지할 수가 없습니다.
    • 따라서 배열을 바탕으로 Section 전체를 매번 새롭게 그려줘야하는 문제가 발생했습니다.

해결

#1

  • CollectionView안에 CollectionView가 존재하는 형태의 경우 애플에서 CompositionalLayout을 권장하고 있습니다.
  • Compositional Layout의 경우 Section별로 다른 높이, 형태를 주기 편하고 Cell을 만드는 Item 값에 따라서 특정 멘트와 함께 Section의 높이를 변경시켜줘야 하는 등 다이나믹한 화면 구성이 간편해집니다.
  • 또한 가로 스크롤이 가능한 Section을 간단히 생성할 수 있어 Compositional Layout을 채택하였습니다.

#2

  • Diffable을 사용하게되면 배열을 기반으로 Snapshot을 만들어서 달라진 부분만을 손쉽게 파악하여 새롭게 CollectionView를 그릴 수 있게 됩니다.
  • 따라서 전체 Section을 리로드하지 않고 달라진 부분만을 보여줄 수 있어서 기존 방식에 비해 비용이 적다고 판단하여 DiffableDatasource를 사용하게 되었습니다.