Retrieve an image from Firebase to an UIimage swift5

本小妞迷上赌 提交于 2021-02-05 09:34:06

问题


I'm struggling to download pictures from firebase storage to an UIImage in swift 5.

I can well upload them. When I tried to retrieve picture, the UIImage display a black screen.

here my function which return the UIImage

import UIKit

import Firebase

func getImageEvent (imagePath : String) -> UIImage? {

    var myImage : UIImageView?

    //Access to the storage
    let storageRef =  Storage.storage().reference(withPath: imagePath)

    storageRef.getData(maxSize: 1 * 1024 * 1024) {(data, error) in

        if let error = error {
            print(error.localizedDescription)
            return
        }

        if let data = data {

            print(data.description)

            myImage?.image = UIImage(data: data)

        }
    }

    return myImage?.image
}

//Call the function

getImageEvent (imagePath :"9U4BoXgBgTTgbbJCz0zy/eventMainImage.jpg")

In the console, I can well see a value for print(data.description).

By default, there is an image in the UIImageView. When call the function, the default image is replaced by a black screen.

Could you please help me to understand the mistake ?

many thanks


回答1:


There's a number of ways to go about this but a brief description of the issue first:

The return statement within the closure will execute way before that image is downloaded - Firebase functions are asynchronous and code has to be crafted in a way that allows for time to download and get data from the internet. So - don't try to return data from asynchronous functions.

Here's the code re-written with a completion handler. That handler will be called only after the image is fully downloaded.

func getImageEvent (imagePath: String, completion: @escaping(UIImage) -> Void) {
    var myImage : UIImageView?
    let storageRef =  Storage.storage().reference(withPath: imagePath)
    storageRef.getData(maxSize: 1 * 1024 * 1024) { data, error in
        if let error = error {
            print(error.localizedDescription)
            return
        }

        if let data = data {
            if let myImage = UIImage(data: data) {
                completion(myImage)
            }
        }
    }
}

and the key is how to call that function. Note this code awaits the data (UIImage) to be passed back to it within it's closure and lets you know that getting the image was complete.

self.getImageEvent(imagePath: "9U4BoXgBgTTgbbJCz0zy/eventMainImage.jpg", completion: { theImage in
    print("got the image!")
})

You should add additional error checking in case the image was not downloaded or myImage was nil. Passing back an error message along with the nil myImage would be one option, or making the object passed back as an optional and then checking for nil within self.downloadImageAtPath would be another.




回答2:


To complete the solution, below the code used to in tableView to get picture in a particular cell

 getImageEvent(imagePath: myArray[indexPath.row].partyImagePath) { (image) in

         cell.partyImage.image = image

        }


来源:https://stackoverflow.com/questions/60203762/retrieve-an-image-from-firebase-to-an-uiimage-swift5

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!