본문 바로가기

UIKIT/Firebase

🔍 Firebase Storage listAll(completion:) 설명

https://explorer89.tistory.com/380

 

🔥 Firebase의 Storage 내에 저장된 여러 이미지 삭제하기!

https://firebase.google.com/docs/storage/ios/delete-files?hl=ko Apple 플랫폼에서 Cloud Storage로 파일 삭제  |  Cloud Storage for Firebase4월 9~11일, Cloud Next에서 Firebase가 돌아옵니다. 지금 등록하기 의견 보내기 Apple 플

explorer89.tistory.com

 

🔍 Firebase Storage listAll(completion:) 설명

🔹 기능

listAll(completion:)은 Firebase Storage에서 특정 경로 아래의 모든 파일(items)과 폴더(prefixes)를 가져오는 메서드입니다.

func listAll(completion: @escaping (Result<StorageListResult, any Error>) -> Void)

 

  • 매개변수 (completion)
    • completion은 비동기적으로 실행되는 클로저이며, 결과(StorageListResult) 또는 에러(Error)를 반환하는 Result 타입을 사용합니다.
    • 성공(.success(StorageListResult)) → Storage에 있는 파일 목록을 가져옴.
    • 실패(.failure(Error)) → 오류가 발생하면 Error를 반환.

🔹 반환값 (StorageListResult)

  • StorageListResult는 현재 Storage 경로 아래의 파일과 폴더 목록을 포함하는 객체입니다.
    • .items → 현재 폴더 안에 있는 파일(이미지, 동영상 등) 목록을 반환합니다.
    • .prefixes → 현재 폴더 안에 있는 하위 폴더 목록을 반환합니다.

 

 

✅ 사용 예제

📌 Firebase Storage에서 특정 경로 아래의 모든 파일 가져오기

let storageRef = Storage.storage().reference().child("users/user123/reviews/review456/")

storageRef.listAll { result in
    switch result {
    case .success(let listResult):
        print("📂 하위 폴더 목록: \(listResult.prefixes)")
        print("📄 파일 목록: \(listResult.items)")

        for item in listResult.items {
            print("파일 경로: \(item.fullPath)")
        }

    case .failure(let error):
        print("❌ 파일 목록 가져오기 실패: \(error.localizedDescription)")
    }
}

 

🔍 설명

1️⃣ Storage.storage().reference().child("users/user123/reviews/review456/")
→ "users/user123/reviews/review456/" 경로 아래의 파일과 폴더 목록을 가져옴.
2️⃣ listAll { result in ... }을 호출하면 비동기적으로 Storage에서 파일 목록을 가져옴.
3️⃣ switch result 문을 사용하여

  • .success(let listResult)이면 파일 및 폴더 목록을 출력.
  • .failure(let error)이면 오류 메시지를 출력.4️⃣ listResult.items을 사용하면 파일 목록을 가져올 수 있음.5️⃣ listResult.prefixes를 사용하면 폴더(디렉토리) 목록을 가져올 수 있음.

 

사용 시 주의사항

1️⃣ 비동기 작업이므로 데이터 로딩이 완료될 때까지 기다려야 함

  • listAll()은 네트워크 요청을 사용하여 데이터를 가져오는 비동기 작업이므로, 즉시 결과를 반환하지 않습니다.
  • 따라서 결과를 사용하려면 반드시 completion 클로저 내부에서 처리해야 합니다.
  • 즉, listAll()을 호출한 후 즉시 listResult.items에 접근하면 안 됩니다.

2️⃣ 하위 폴더가 많을 경우 메모리 사용량 증가 가능

  • listAll()은 해당 경로에 있는 모든 항목을 메모리에 로드하므로, 파일이 너무 많으면 메모리 사용량이 증가할 수 있습니다.
  • 따라서 대량의 데이터를 처리해야 하는 경우, list(maxResults:)를 사용하여 페이지네이션(pagination)을 구현하는 것이 좋습니다.

3️⃣ 파일이 추가되거나 삭제될 경우 결과 일관성이 보장되지 않을 수 있음

  • listAll()을 실행하는 동안 다른 사용자가 Storage에 파일을 추가하거나 삭제하면 결과가 일관되지 않을 수 있음.
  • Firebase는 이 문제를 방지하기 위해 한 번 실행한 listAll()의 결과를 메모리에 저장하여 반환하지만, 서버에서 실시간 동기화는 보장하지 않습니다.