【问题标题】:How to download and declare a large number of images from Firebase Storage?如何从 Firebase Storage 下载并声明大量图片?
【发布时间】: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


【解决方案1】:

如果您要从 firebase 获取大量数据,也许您应该考虑使用分页来一次获取几张图片以避免 UI 冻结。下面我有一个来自 Brian Voong 的 Instagram firebase 课程 (https://www.letsbuildthatapp.com/course/Instagram-Firebase) 的示例函数。

    fileprivate func paginatePosts() {

    guard let uid = self.user?.uid else {return}
    let ref = Database.database().reference().child("posts").child(uid)

    var query = ref.queryOrdered(byChild: "creationDate")


    if posts.count > 0 {
        let value = posts.last?.creationDate.timeIntervalSince1970
        query = query.queryEnding(atValue: value)

    }

    query.queryLimited(toLast: 4).observeSingleEvent(of: .value, with: { (snapshot) in
        print("all snapshots: ", snapshot)
        guard var allObjects = snapshot.children.allObjects as? [DataSnapshot] else {return}

        allObjects.reverse()

        if allObjects.count < 4 {
            self.isFinishedPaging = true
        }

        if self.posts.count > 0 && allObjects.count > 0 {
            allObjects.removeFirst()
        }

        guard let user = self.user else {return}

        allObjects.forEach({ (snapshot) in

            guard let dictionary = snapshot.value as? [String : Any] else {return}
            var post = Post(user: user, dictionary: dictionary)

            post.id = snapshot.key

            self.posts.append(post)

        })

        self.posts.forEach({ (post) in

        })

        self.collectionView?.reloadData()
    }) { (err) in
        print("Failed to paginate for posts:", err)
    }

}

【讨论】:

    猜你喜欢
    • 2016-11-03
    • 2019-10-04
    • 1970-01-01
    • 2017-01-28
    • 2016-04-13
    • 2019-04-17
    相关资源
    最近更新 更多