Получить изображение из Firebase в UIimage Swift5 - PullRequest
0 голосов
/ 13 февраля 2020

Я изо всех сил пытаюсь загрузить изображения из хранилища Firebase в UIImage в Swift 5.

Я вполне могу загрузить их. Когда я попытался получить изображение, UIImage отображал черный экран.

здесь моя функция, которая возвращает 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")

В консоли я хорошо вижу значение для печати (data.description).

По умолчанию в UIImageView есть изображение. При вызове функции изображение по умолчанию заменяется черным экраном.

Не могли бы вы помочь мне понять ошибку?

большое спасибо

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Для завершения решения, под кодом, который используется в tableView для получения изображения в определенной ячейке

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

         cell.partyImage.image = image

        }
0 голосов
/ 13 февраля 2020

Есть несколько способов go об этом, но сначала краткое описание проблемы:

Оператор возврата в закрытии будет выполняться до загрузки этого образа - функции Firebase асинхронны и кодируют должен быть обработан таким образом, чтобы у вас было время для загрузки и получения данных из inte rnet. Поэтому не пытайтесь возвращать данные из асинхронных функций.

Вот код, переписанный с помощью обработчика завершения. Этот обработчик будет вызываться только после полной загрузки образа.

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)
            }
        }
    }
}

, и ключ в том, как вызвать эту функцию. Обратите внимание, что этот код ожидает данных (UIImage), которые будут переданы обратно в его закрытие, и сообщает, что получение изображения завершено.

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

Вам следует добавить дополнительную проверку ошибок, если изображение не было скачал или myImage был ноль. Передача сообщения об ошибке вместе с nil myImage была бы одной из опций, или сделать объект переданным обратно как необязательный, а затем проверка на nil в self.downloadImageAtPath была бы другой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...