ํ”„๋กœ์ ํŠธ ๐Ÿ› ๏ธ/iOS

Firebase Storage ์— asnyc/await ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค์ค‘์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌํ•˜๊ธฐ

WonderPark 2023. 4. 6. 21:14

Firebase๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์ด์–ด๋ฆฌ ์•ฑ ๋งŒ๋“ค๊ธฐ ํ”„๋กœ์ ํŠธ์˜ "๋‹ค์ค‘์ด๋ฏธ์ง€ ์—…๋กœ๋“œ" ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์—์„œ

๋‹ค์ด์–ด๋ฆฌ ๊ฒŒ์‹œ๋ฌผ์˜ ๋‹ค์ค‘์ด๋ฏธ์ง€๋ฅผ fetch (๋ถˆ๋Ÿฌ์˜ค๊ธฐ) ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ async/await ์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค.

 

๋จผ์ € ๋‹ค์ค‘์ด๋ฏธ์ง€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Firebase Storage ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ , DB๋Š” Firebase firestore๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

๋‚ด๊ฐ€ ๋‹ค์ค‘์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ฒ˜์Œ์— ๊ตฌํ˜„ํ–ˆ๋˜ fetchImage ๋ฉ”์†Œ๋“œ์ด๋‹ค.

func fetchAllImage(_ magazine: Magazines) {
        // ๋น„๋™๊ธฐ ์ž‘์—… 1
        let _ = storage.reference().child("\(magazine.id)").listAll { result, error in
            
            if let result = result {
                result.items.forEach { item in
                    // ๋น„๋™๊ธฐ ์ž‘์—… 2
                    item.getData(maxSize: 20 * 1024 * 1024) { data, error in
                        if let error = error {
                            print("error while downloading image\n\(error.localizedDescription)")
                            return
                        } else {
                            let image = UIImage(data: data!)
                            self.imgArr.append(image!)
                            return
                        }
                    }
                }
            }          
        }
    }

 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋จผ์ € fetchImages๋ผ๋Š” ๋ฉ”์†Œ๋“œ์•ˆ์—์„œ๋Š” ์ด 2๊ฐ€์ง€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ผ์–ด๋‚ ๊ฒƒ์ด๋‹ค.

  • ์ฒซ๋ฒˆ์งธ๋Š” firestore ์—์„œ path๋ฅผ ์„ค์ •ํ•˜์—ฌ ํ•ด๋‹น path ์— ์žˆ๋Š” ๋ชจ๋“  ์ด๋ฏธ์ง€๋“ค์„ listAll ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด๊ณ 
  • ๋‘๋ฒˆ์งธ๋Š” ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋“ค์„ getData(maxSize: ..) ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋Š” ์ด๋ฏธ์ง€ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ์ž‘์—…์ด๋‹ค

 

์ฒ˜์Œ ์‚ฌ์šฉํ–ˆ๋˜ listAll ๋ฉ”์†Œ๋“œ๋Š” ์ด๋ ‡๊ฒŒ completion์ด๋ผ๋Š” @escaping ํด๋กœ์ ธ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ณ  ์žˆ๋Š” ํ˜•ํƒœ์ด๋‹ค.

๋˜ ์ฒ˜์Œ ์‚ฌ์šฉํ–ˆ๋˜ getData ๋ฉ”์†Œ๋“œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ @escaping ํด๋กœ์ ธ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ณ  ์žˆ๋Š” ํ˜•ํƒœ์ด๋‹ค. 

 

๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ ์€

  1. ์ฒ˜์Œ์— ๋‚ด๊ฐ€ ์˜๋„ํ–ˆ๋˜ ๊ฒƒ์€ ์œ„์˜ ๋ฉ”์†Œ๋“œ์—์„œ getData๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋“ค์„ ๋ฉ”์†Œ๋“œ ๋‚ด์— ์žˆ๋Š” ๋ฐฐ์—ด์— ๋‹ด์•„์„œ “๋ฆฌํ„ด” ํ•ด์ฃผ๋Š” ๊ฒƒ์ด์—ˆ๋Š”๋ฐ ํด๋กœ์ ธ ๋‚ด์—์„œ๋Š” ์™ธ๋ถ€ ๋ณ€์ˆ˜์— ์ ‘๊ทผ์„ ํ•  ์ˆ˜๊ฐ€ ์—†์–ด, array ์•ˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„ ๋ฆฌํ„ดํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ์ 
  2. ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด result.items.forEach ๋ถ€๋ถ„์—์„œ ๋ฐ˜๋ณต๋ฌธ์„ ๋„๋Š”๋ฐ, getData์˜ ํด๋กœ์ ธ์•ˆ์—์„œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ํ•œ๊ฐœ๊ฐ€ ๋ฐฐ์—ด์— ์ €์žฅ๋ ๋•Œ ๋ฐ”๋กœ ํด๋กœ์ ธ๊ฐ€ return ๋˜์–ด ์ด ๋ฉ”์†Œ๋“œ๊ฐ€ ๋๋‚˜๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ์ง€ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์–ด ๋‹ค์ค‘์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋ฌธ์ œ์ 

๊ทธ๋ž˜์„œ completion ํด๋กœ์ ธ๋ฅผ ์‚ฌ์šฉํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฐฉ์‹์ด ์•„๋‹Œ async/await ์„ ์‚ฌ์šฉํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด๋ณด์•„์•ผ๊ฒ ๋‹ค๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

 

 

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ fetchAllImage ๋ฉ”์†Œ๋“œ์•ˆ์— ๋ชจ๋“  ๋น„๋™๊ธฐ ์ž‘์—…์„ async/await ์œผ๋กœ ๋ฐ”๊ฟ”์„œ ์ฒ˜๋ฆฌํ•ด์•ผํ• ๊นŒ?

 

์ผ๋‹จ ์ฒ˜๋ฆฌํ•ด์•ผํ•  ๋น„๋™๊ธฐ์ž‘์—…์ค‘ ์ฒซ๋ฒˆ์งธ๋Š” listAll ๋ฉ”์†Œ๋“œ์ด๋‹ค.

 

์•Œ๊ณ ๋ณด๋‹ˆ listAll ๋ฉ”์†Œ๋“œ์—๋„ ์ข…๋ฅ˜๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ!

๋‚ด๊ฐ€ ์ฒ˜์Œ ์‚ฌ์šฉํ–ˆ์—ˆ๋˜ listAll ๋ฉ”์†Œ๋“œ๋Š” await ์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹Œ completion ํด๋กœ์ ธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ˜•ํƒœ์˜€๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋Ÿฐ ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ await์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ์žˆ์„๊ฒƒ์ด๋‹ค…! ๋ผ๋Š” ๋А๋‚Œ์ ์ธ ๋А๋‚Œ

 

๊ทธ๋ ‡๋‹ค! listAll ๋ฉ”์†Œ๋“œ๊ฐ€

 

์ด๋ ‡๊ฒŒ listAll ๋ฉ”์†Œ๋“œ์˜ async/await ๋ฒ„์ „์ด ์กด์žฌํ•˜๊ณ  ์žˆ์—ˆ๋”ฐ…!

๊ธฐ์กด์˜ listAll์„ ๋ž˜ํ•‘ํ•ด์„œ await์œผ๋กœ ๋ฆฌํ„ดํ•˜๋Š” ๋ชจ์–‘์ƒˆ..ใ…Žใ…Žใ…Ž

 

ํ . . ๊ทธ๋ ‡๋‹ค๋ฉด getData๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์ค„ ๊ฒƒ์ธ๊ฐ€..!

์•„๊นŒ listAll ๋ฉ”์†Œ๋“œ์ฒ˜๋Ÿผ ํ˜•ํƒœ๋งŒ ๋‹ค๋ฅธ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„๊นŒ ? ํ•ด์„œ getData์˜ ๋‹ค๋ฅธ ํ˜•ํƒœ๋“ค์ด ์žˆ๋Š”์ง€ ์ฐพ์•„๋ณด์•˜์ง€๋งŒ ์—†์—ˆ๋‹ค.. !

 

๊ทธ๋ ‡๊ฒŒ ์‚ฝ์งˆ ์‹œ์ž‘ …

์—ด์‹œ๋ฏธ ๊ตฌ๊ธ€๋ง ํ•˜๋˜์ค‘ ์ˆ˜์ƒํ•œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฐœ๊ฒฌ..!

 

 

๋ฐ”๋กœ data ๋ผ๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

 

์ด ๋ฉ”์†Œ๋“œ๋ฅผ ๋ณด๋ฉด ์Šคํ† ๋ฆฌ์ง€๋ ˆํผ๋Ÿฐ์Šค์— ์žˆ๋Š” ๊ฐ์ฒด๋“ค์„ ๋น„๋™๊ธฐ์‹์œผ๋กœ ๋‹ค์šด๋กœ๋“œ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค. ์œ„์—์„œ ์“ฐ์ธ getData์™€ ๋น„์Šทํ•œ ๋ฉ”์†Œ๋“œ์ง€๋งŒ data ๋ฉ”์†Œ๋“œ๋Š” async/await์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ง„ ๋ฉ”์†Œ๋“œ์˜€๋‹ค.

 

 

์ž ์ด์ œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์œผ๋‹ˆ ์ฝ”๋“œ์— ์ ์šฉํ•ด๋ณด๋ฉด ์ด๋Ÿฌํ•˜๋‹ค! 

 

 func fetchImages(_ diary: Diary) async -> [UIImage] {
        var diaryImage: [UIImage] = []

        do {
            let result = try await storage.reference().child("\(diary.id)").listAll()
            for item in result.items {
                let data = try await item.data(maxSize: 20 * 1024 * 1024)
                let image = UIImage(data: data)
                diaryImage.append(image!)
            }
        } catch {
            print("error")
        }
        
        return diaryImage
    }

 

ํ•ด๊ฒฐ์™„๋ฃŒ~๐Ÿ˜†