【发布时间】:2017-04-29 10:58:10
【问题描述】:
我正在创建一个向用户显示大量交易卡的 iOS 应用程序(在 Xcode 中使用 Swift)。卡片信息(名称、攻击等)以 JSON 文件的形式存储在 Firebase 数据库中。我想将每张卡片的图像存储在 Firebase 存储中,但不知道如何以类似于填充 Assets.xcassets 文件夹的方式检索它们。
如果可能的话,我想遍历存储中的所有图像并将每个图像声明为 UIImage,以便以后可以通过我的 collectionView 按名称调用它们并显示。
有没有办法用循环声明数百个变量,每个变量都有一个唯一的变量名?如何将这些变量设置为我保存在存储中的图像?
我看到的从存储中下载的大部分代码看起来都与此类似:
// Create a reference to the file you want to download
let islandRef = storageRef.child("images/island.jpg")
// Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes)
islandRef.dataWithMaxSize(1 * 1024 * 1024) { (data, error) -> Void in
if (error != nil) {
// Uh-oh, an error occurred!
} else {
// Data for "images/island.jpg" is returned
// ... let islandImage: UIImage! = UIImage(data: data!)
}
}
这只会下载一张图片,将变量命名为“islandImage”。我需要能够为我的 firebase 数据库中的每个项目执行此操作。
【问题讨论】:
-
通常您会将 URL 存储在数据库中,检索它们并使用它们从存储中检索图像。例如,您在数据库 /urls 中有一个节点,然后是每个 URL 的“列表”。 /url0: "image 0" 和 /url1: "image 1" 等。然后您将观察 /urls 节点并使用这些 url 填充数组。然后遍历数组以从数据库中检索图像。这行得通吗?
-
@Jay 当你说“检索”观察方法中的图像时,你的意思是什么?例如,每个图像是否会存储在数组中而不是变量中? (我被警告不要将图像存储在数组中,因为它会导致内存问题)
-
这取决于您的用例。图像可以是很小的缩略图,可以毫无问题地保存在数组中。如果它们是巨大的多演出文件,那显然不是最好的解决方案。 “检索”可能意味着很多事情,但使用 Firebase 有两种选择:下载到内存或下载到磁盘,两者都涵盖 Firebase Datastore。数组是“变量结构”,通常包含类。想象一个类:Playing_Card;卡片上的图像(黑桃、心形等)是 .jpg,卡片的值是 int 2-14 (Ace)
-
并且...将“图像”存储在数组中没有问题。毕竟,图像只是像字符串一样的一系列字节(位)。这一切都取决于它们有多大和用例。但是,如果您的图像是静态的,则应将它们作为应用程序的一部分包含在内,而不是下载它们。
-
@Jay 在我尝试使用存储等之前,我使用了一个包含 UIImage 的卡片对象数组,这会导致内存填满并崩溃,因为我有数百张图像。我需要一种方法来保存这些图像而不将它们放入数组中
标签: ios swift firebase firebase-realtime-database firebase-storage