如何从Firebase存储下载并声明大量图像?

时间:2016-12-14 07:32:23

标签: ios swift firebase firebase-realtime-database firebase-storage

我正在创建一个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数据库中的每个项目执行此操作。

1 个答案:

答案 0 :(得分:0)

如果您从firebase获取大量数据,也许您应该考虑使用分页来一次获取一些图像以避免冻结UI。下面我有一个Brian Voong的Instagram火基课程(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)
    }

}