提问者:小点点

下载多个图像后超出Cloud Storage for Firebase带宽配额-最佳做法是什么?


我正在构建一个iOS应用程序,其中包含存储在Fi的数据和存储在Cloud Storage for Firebase中的相关图像。本质上,我的应用程序的起始屏幕是一个滚动卡片列表,代表我的Fi恢复集合中的文档和相关图像(从Cloud Storage中提取,使用文档标题匹配)。

为了生成开始的scrollview数据,每次打开我的应用程序时,我都会调用Fi恢复和云存储来填充我的本地结构并检索图像(其中大约10个,每个600像素乘400像素,300-500KB之间)。

我目前使用的是免费的Spark计划。我的配额对Fi恢复来说很好,但是昨天,我在模拟器中测试了应用程序(可能运行了它~60次?),超过了Cloud Storage调用的1 GB带宽限制。我想这是因为我下载了很多图像而没有将它们存储在本地(因为每次运行应用程序时我都会再次下载它们?)。

以下是每次打开应用程序以获取所有数据和关联图像时运行的代码:

//  StoryRepository.swift

import Foundation
import FirebaseFirestore
import FirebaseStorage
import FirebaseFirestoreSwift

class StoryRepository: ObservableObject { // listen to any updates
    let db = Firestore.firestore()
    let storage = Storage.storage()
    
    @Published var stories = [Story]() // Story is a local struct with vars for title, previewImage (the associated card image I get from Cloud Storage), and other data in Firestore. 
    
    init() {
        loadStoryCardData()
    }
    
    func loadStoryCardData() {
        db.collection("stories").addSnapshotListener{ (querySnapshot, error) in
            guard let documents = querySnapshot?.documents else {
                print("Error fetching documents: \(error!)")
                return
            }
            
            // create Cloud Storage reference
            let storageRef = self.storage.reference()
            
            // each document represents a story. get the title of that story, and then fetch the image from Cloud Storage that has the same filename as that title.
            documents.forEach { document in
                guard let title = document["title"] as? String else {
                    print("Could not read story title.")
                    return
                }
                
                let primaryImageRef = storageRef.child("storyCardPrimaryImages/" + title + ".jpg")

                // Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes)
                primaryImageRef.getData(maxSize: 1 * 1024 * 1024) { data, error in
                    if let error = error {
                        print("Error fetching primary image: \(error)")
                        return
                    } else {
                        if let image = UIImage(data: data!) {
                            self.stories.append(Story(title: title, previewImage: image, data: document.data())!)
                        }
                    }
                }
            }
        }
    }
}

我只是想知道如何优化这一点,因为当我发布这个应用程序并获得用户时,我可以想象我的带宽会去哪里。我应该将本地结构和图像存储在iOSFileManager中,这样我就只能在应用程序首次运行时下载一次吗?我将如何更新本地数据,如果Fi恢复或云存储中的任何内容发生变化?

我想过将图像存储在更小的尺寸中,但我真的需要它们在我的应用程序中是600px x 400px。如果可能的话,我更喜欢保持免费的Spark计划。老实说,我只是有点吃惊,我在测试时已经遇到了配额限制-


共1个答案

匿名用户

是否应该将本地结构和图像存储在iOSFileManager中,以便在应用程序首次运行时只下载一次?

使用这样的本地缓存绝对是减少总带宽使用的一种好方法。

如果Fi恢复或Cloud Storage中的任何内容发生变化,我将如何更新本地数据?

这将由您来设计。一般来说,一种方法是让您的进程更新存储中的对象,同时更新有关图像的一些元数据,并将其存储在Fi恢复中。您的应用程序可以查询Fi恢复的更改,然后在再次下载之前检查您的本地缓存文件是否是最新的。

我想过将图像存储在更小的尺寸中,但我真的需要它们在我的应用程序中是600px x 400px。

您可以随时增加JPG压缩量,这也会降低图像的质量。这是您必须根据自己的喜好进行实验的权衡。