Skip to content

여행 목록 화면 레이아웃 버튼 애니메이션 적용 버그

songju edited this page Nov 30, 2020 · 3 revisions

문제 인식

issue

  • 앱 최초 실행 후 좌측 상단의 버튼으로 레이아웃을 변경했을 때, snapshot apply의 애니메이션이 적용되지 않음
  • 첫 화면에서 보이던 두 셀을 제외한 나머지 셀들의 애니메이션이 적용되지 않는 것을 보면, 데이터가 셀에 처음으로 로드될 때 애니메이션이 적용되지 않는 것일까?

해결 과정

  • 우선 snapshot apply는 datasource를 새로 configure하지는 않는다.. 따라서 새로 여행이 추가되거나 삭제됐을 경우 헤더의 여행 숫자를 바꿀 수 없었다.
  • 애니메이션을 포기하고 reloadData를 하기엔 너무 아쉽고 그렇다고 기능을 포기할 수는 없었기에 기존 코드를 아래 처럼 작성했었다.
func applySnapShot(with travels: [TravelItemViewModel]) {
    var snapShot = SnapShot()
    
    ...

    dataSource.apply(snapShot, animatingDifferences: true) {
        self.travelListColletionView.reloadData()
    }
}

  • 그러다 보니 중첩이 되었는지(?) apply가 진행되는 중간에 reload가 되는 문제였다... (completion 내부였는데.....😦 학습이 필요하다)
  • 우선, 여행 목록 뷰모델이 바뀌는 순간마다 applySnapshot을 해주는데 스냅샷을 찍기 전에 reload를 먼저 해주면 어떨까 싶어서 위의 apply 메소드의 completion을 삭제하고 따로 reloadData를 해주었다.
var travelListViewModel: TravelListPresentable? {
    didSet {
        travelListViewModel?.didFetch = { [weak self] fetchedTravels in
            self?.travelListCollectionView.reloadData()
            self?.applySnapShot(with: fetchedTravels)
        }
    }
}

해결!!


버그수정


  • 섹션 헤더만 업데이트 해주면 되는데 데이터 전체를 reload해주는 것이 비효율적이라고 생각이 들었고 조금 더 좋은 방법이 있는지 찾아보고 개선해야한다... 컬렉션뷰에 reloadSections 라는 메소드도 있지만 알 수 없는 에러가 발생해서 적용시킬 수 없었다 😓

BoostPocket 🏖

🤝 규칙
🔖 프로젝트 상세
📝 회의
🏃 1주차 데일리스크럼
🏃 2주차 데일리스크럼
🏃 3주차 데일리스크럼
🏃 4주차 데일리스크럼
🏃 5주차 데일리스크럼
👨‍👨‍👧‍👦 피어세션
🗣 팀 회고

📱 개발 진행 상황
🧐 학습
❓ Trouble Shooting
Clone this wiki locally