[TIL] 10.27

Junyoung_Hong·2023년 10월 27일
0

TIL_10월

목록 보기
18/20
post-thumbnail

1. Firebase Storage 이미지 삭제하기

게시글을 만들 때 이미지를 저장하지만, 게시글을 수정하게 되면 기존의 이미지를 삭제하기도 한다. 사용자가 이미지 삭제 버튼을 누르면, 로컬에 있는 딕셔너리에서 해당 이미지가 삭제된다. 그렇다면 로컬에서 삭제된 이미지가 Storage에서도 삭제가 되면 된다.

1-1. 함수 흐름

먼저 Storage의 참조를 가져온다. 이미지를 업로드 할 때, 경로 자체를 저장했기 때문에, reference() 까지만 참조한다. 처음에는 이미지를 업로드하는 참조를 그대로 가져왔는데, 실행이 되지 않았었다. 경로가 중복해서 두 번 들어갔기 때문이었다.

let storageRef = Storage.storage().reference()

DispatchGroup 을 생성해서 이미지 삭제 작업을 동기화한다.

let dispatchGroup = DispatchGroup()

imagePaths 배열을 순회하면서 각 이미지 경로에 대한 참조를 생성하고 delete 메서드를 호출하여 이미지를 삭제한다.

for imagePath in imagePaths {
    dispatchGroup.enter()
    let ref = storageRef.child(imagePath)
    
    ref.delete { error in
        if let error = error {
            print("이미지 삭제 중 오류 발생: \(error)")
        } else {
            
            print("이미지가 성공적으로 삭제되었습니다.")
        }
        dispatchGroup.leave()
    }
}

모든 이미지 삭제 작업이 완료될 때까지 기다렸다가, 모두 완료되면 completion 클로저를 호출하여 작업 완료를 알린다.

dispatchGroup.notify(queue: .main) {
    completion(true)
}

1-2. 전체 코드

func deleteImage(clubID: String, noticeBoardID: String, imagePaths: [String], completion: @escaping (Bool) -> Void) {
//        let storageRef = Storage.storage().reference().child("noticeBoards").child(clubID).child(noticeBoardID).child("images")
    let storageRef = Storage.storage().reference()
    
    let dispatchGroup = DispatchGroup()
    
    for imagePath in imagePaths {
        dispatchGroup.enter()
        let ref = storageRef.child(imagePath)
        
        ref.delete { error in
            if let error = error {
                print("이미지 삭제 중 오류 발생: \(error)")
            } else {
                
                print("이미지가 성공적으로 삭제되었습니다.")
            }
            dispatchGroup.leave()
        }
    }
    
    dispatchGroup.notify(queue: .main) {
        completion(true)
    }
}

1-3. 적용하기

Storage에서 이미지 삭제가 완료되면, 딕셔너리의 key 값을 nil로 줘서 삭제를 시킨다. 그리고 해당 사진이 있던 cell도 삭제한다. Storage에서 이미지를 삭제하는 것을 먼저 진행하는 이유는 안정성 때문이다. 만약 반대로 로컬에서 지우고, Storage에서 지우게 되면 만약 Storage에서 지우는 과정에서 오류가 나서 지워지지 않으면, 사용자는 불편한 경험을 얻게 된다.

func removeCell(_ indexPath: IndexPath) {
    // 선택한 이미지의 Storage 경로를 가져옴
    let imagePath = firebaseManager.noticeBoards[editingMemoIndex!].imageList[indexPath.row]
    
    // Firebase Storage에서 이미지를 삭제
    firebaseManager.deleteImage(clubID: club.id, noticeBoardID: firebaseManager.noticeBoards[editingMemoIndex!].id, imagePaths: [imagePath]) { success in
        if success {
            // 로컬에서 이미지를 삭제하고 Collection View를 업데이트
            self.createNoticeBoardView.galleryCollectionView.performBatchUpdates {
                self.firebaseManager.selectedImage[String(indexPath.row)] = nil
                self.createNoticeBoardView.galleryCollectionView.deleteItems(at: [indexPath])
            } completion: { (_) in
                self.createNoticeBoardView.galleryCollectionView.reloadData()
            }
        } else {
            print("Firebase Storage에서 이미지 삭제 실패")
        }
    }
}
profile
iOS 개발자를 향해 성장 중

0개의 댓글