我正在构建一个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计划。老实说,我只是有点吃惊,我在测试时已经遇到了配额限制-
是否应该将本地结构和图像存储在iOSFileManager中,以便在应用程序首次运行时只下载一次?
使用这样的本地缓存绝对是减少总带宽使用的一种好方法。
如果Fi恢复或Cloud Storage中的任何内容发生变化,我将如何更新本地数据?
这将由您来设计。一般来说,一种方法是让您的进程更新存储中的对象,同时更新有关图像的一些元数据,并将其存储在Fi恢复中。您的应用程序可以查询Fi恢复的更改,然后在再次下载之前检查您的本地缓存文件是否是最新的。
我想过将图像存储在更小的尺寸中,但我真的需要它们在我的应用程序中是600px x 400px。
您可以随时增加JPG压缩量,这也会降低图像的质量。这是您必须根据自己的喜好进行实验的权衡。