从而不使用while循环使用实时数据库从Firebase存储中检索和加载图像?

时间:2017-11-03 04:30:33

标签: ios swift firebase while-loop firebase-storage

我正在使用Firebase在Swift中开发一个照片库应用程序来存储图像。我的目标是在视图加载时将所有图像加载到集合视图中。

图像存储在名为images_(用户电子邮件)_(用户ID)的文件夹中。用户上传存储在Firebase存储中的图像,其名称为image0.png,image1.png,image2.png等。现在,我已成功创建帐户并存储图像。现在,我正在尝试在viewDidLoad()的集合视图中加载图像。我没有使用Firebase实时数据库,因为我觉得这对我想要完成的事情来说太过分了。

while (isDownloading == true) {

        let storage = Storage.storage()
        let storageRef = storage.reference();
        let imageLoadRef = storageRef.child(("images_" + (Auth.auth().currentUser?.email)! + "_" + (Auth.auth().currentUser?.uid)!) + "/image" + String(self.imageCount) + ".png")

        imageLoadRef.getData(maxSize: 10 * 1024 * 1024) { data, error in
            if let error = error { 
                self.isDownloading = false
            } else {
                let loadedImage = UIImage(data: data!)

                //Updates collection view with loaded image
                self.collectionView.reloadData()

                //moves on to next image
                self.imageCount += 1
            }
        }
    }

一旦视图加载,我就会运行一个while循环,遍历用户文件夹中的所有图像。由于我没有办法获取文件夹中的图像数量,我不得不使用while循环并在找不到下一个图像时将其中断。例如,如果文件夹中只有5个图像,则代码在尝试加载第6个不存在的图像时将返回错误。当发生这种情况时,我尝试捕获错误并通过将条件isDownloading设置为false来中断while循环。

但是,我遇到的问题是while循环永远不会中断,即使它应该返回错误并将isDownloading设置为false。

为了澄清,imageCount变量随着while循环的每次迭代而增加,以获得文件夹中的下一个图像。因此,当imageCount = 1时,代码将尝试加载名为“image1.png”的照片。但是,如果它不存在,它会捕获错误并中断while循环。

我知道我构建它的方式有点令人困惑,但我发现它比使用downloadURL和Firebase数据库更有效。

感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

不知道它是否有效你可以尝试一下现在让我知道问题是否存在

//Loop is Fine
while (isDownloading == true) {
        //Provided Required References 
        let storage = Storage.storage()
        let storageRef = storage.reference();
        //Name of file to download 
        let imageLoadRef = storageRef.child(("images_" + (Auth.auth().currentUser?.email)! + "_" + (Auth.auth().currentUser?.uid)!) + "/image" + String(self.imageCount) + ".png")
        //handler That Run in async Mode 
        imageLoadRef.getData(maxSize: 10 * 1024 * 1024) { data, error in
            //Here I think mistake is 
            if let error = error { 
                //You are catching error But not handling data error
                self.isDownloading = false
            } 
            else {
                    if data != nil{ // if image found 
                       //here you need to check weather this handler is returning data o not as you got error of no data So Do All functioning here 
                       // User photo here
                       let loadedImage = UIImage(data: data!)

                       //Updates collection view with loaded image
                       self.collectionView.reloadData()

                       //moves on to next image
                       self.imageCount += 1
                    }
                    else {
                       //If Image is not found This will cause you an error which you will handle , According to me this was need to be handled
                       self.isDownloading = false
                    }

            }
        }
    }

如果此解决方案不起作用您可以在GitHub上查看Below Demo项目并使用此方法轻松管理存储在用户下的图像

Link - https://github.com/RockinGarg/FirebaseDemo