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 ํด๋ก์ ธ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๊ณ ์๋ ํํ์ด๋ค.

๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์๊ธฐ๋ ๋ฌธ์ ์ ์
- ์ฒ์์ ๋ด๊ฐ ์๋ํ๋ ๊ฒ์ ์์ ๋ฉ์๋์์ getData๋ฅผ ํตํด ๊ฐ์ ธ์จ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ค์ ๋ฉ์๋ ๋ด์ ์๋ ๋ฐฐ์ด์ ๋ด์์ “๋ฆฌํด” ํด์ฃผ๋ ๊ฒ์ด์๋๋ฐ ํด๋ก์ ธ ๋ด์์๋ ์ธ๋ถ ๋ณ์์ ์ ๊ทผ์ ํ ์๊ฐ ์์ด, array ์์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋ฆฌํดํ ์ ์๋ ๋ฌธ์ ์
- ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด 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
}
ํด๊ฒฐ์๋ฃ~๐
'ํ๋ก์ ํธ ๐ ๏ธ > iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| URLSession + Combine ์กฐํฉ์ผ๋ก ๋คํธ์ํฌ ๋ ์ด์ด ๋ง๋ค๊ธฐ (0) | 2023.06.10 |
|---|---|
| Combine(3): Operator (0) | 2023.06.10 |
| Combine(2): Subject (0) | 2023.06.10 |
| Combine(1): Publisher, Subscriber! (0) | 2023.06.10 |
| @StateObject @ObserverdObject ๊ทธ๋์ ๋ญ์ ๋ค๋ฅธ๋ (0) | 2023.04.06 |