[TIL] 11.03

Junyoung_Hong·2023년 11월 7일
0

TIL_11월

목록 보기
3/5
post-thumbnail

1. 딕셔너리 key 값 삭제에 따른 Cell 재정렬

사진 삭제 기능이라는 한 가지 기능에 몇 번의 오류와 수정이 이루어지는 잘 모르겠다. 이번 포스팅이 마지막 해결 과정이 되기를 정말정말 바란다.

1-1. 문제상황

처음에 사진을 4개 추가를 해서 딕셔너리에 key 값이 0, 1, 2, 3으로 되어 있다. 그 다음 key값이 1인 사진을 지운다음에 재정렬을 해서 0, 2, 3을 다시 0, 1, 2로 맞췄다. 그 다음에 또 key값이 1인 사진을 지우려고 했는데, key 값이 2인 사진이 지워졌다. 그리고 이어서 사진을 삭제하면 Thread 1: "attempt to delete item 2 from section 0 which only contains 2 items before the update" 이런 오류가 뜨면서 앱이 종료된다.

1-2. 문제 원인 파악

딕셔너리의 Key 값은 재정렬을 해줬지만, Cell의 인덱스는 재정렬 해주지 않아서 콜렉션 뷰의 아이템 인덱스가 이미지 딕셔너리의 키와 일치하지 않는 상태가 되어 버려서 그런 것이다.

1-3. 문제 해결

해결의 포인트는 이미지를 삭제할 때, 그리고 컬렉션 뷰와 딕셔너리를 업데이트할 때, 이 두 상태가 항상 일치해야 하는 것이다. 따라서 다음과 같은 흐름으로 코드를 수정했다.

  1. 선택된 이미지를 딕셔너리에서 삭제
  2. 컬렉션 뷰에서 해당 아이템을 삭제
  3. 삭제 작업이 완료된 후, completion에서 딕셔너리를 재정렬
  4. 전체 컬렉션 뷰를 리로드해서 모든 아이템이 적절한 인덱스에 따라 표시되도록 함
func removeLocal(_ indexPath: IndexPath) {
    // 딕셔너리에서 이미지를 삭제
    self.firebaseManager.selectedImage.removeValue(forKey: String(indexPath.row))

    // Collection View에서 해당 아이템을 삭제
    self.createNoticeBoardView.galleryCollectionView.performBatchUpdates {
        self.createNoticeBoardView.galleryCollectionView.deleteItems(at: [indexPath])
    } completion: { [weak self] _ in
        guard let self = self else { return }

        // 딕셔너리의 키를 재정렬하고, 콜렉션 뷰에 반영
        self.reorderSelectedImages()

        // 콜렉션 뷰 전체를 리로드
        self.createNoticeBoardView.galleryCollectionView.reloadData()
    }
}

func reorderSelectedImages() {
    var newSelectedImage: [String: UIImage] = [:]
    var newIndex = 0

    // 키 값을 기준으로 정렬된 딕셔너리를 반복하면서 새로운 인덱스를 할당
    for (_, image) in self.firebaseManager.selectedImage.sorted(by: { Int($0.key)! < Int($1.key)! }) {
        newSelectedImage[String(newIndex)] = image
        newIndex += 1
    }

    // 재정렬된 이미지 딕셔너리를 업데이트
    self.firebaseManager.selectedImage = newSelectedImage
}
profile
iOS 개발자를 향해 성장 중

0개의 댓글