Как загрузить изображение из firebase-хранилища для отображения внутри collectionViewCell ImageView (Swift) - PullRequest
0 голосов
/ 23 сентября 2019

Я загрузил изображение в firebase-storage и сохранил downloadURL в паре ключ / значение внутри моей базы данных.Я написал код, который должен отображать изображение (я) внутри collectionView, после того, как данные были получены, если URL-адрес действителен.Код выполняется в cellForItemAt, поскольку collectionView, содержащий изображения, встроен в другой collectionView (который будет называться Main или MainCV для предотвращения путаницы).

Чтобы решить проблему, я попытался перезагрузить коллекциюпросматривать данные внутри MainCV, а также пытаться протестировать код на контроллере представления только с помощью ImageView (не успешно).

// function to display images
private func icon(_ imageURL: String) -> UIImage {
        //print("imageURL is \(imageURL)")
        let url = URL(string: imageURL)
        var image: UIImage?
        var imageData:Data?
        if url == nil {
            print("URL is \(imageURL)")
            return #imageLiteral(resourceName: "ic_person_outline_white_2x")
        } else {
            URLSession.shared.dataTask(with: url!) { (data, response, error) in
                if error != nil {
                    print("error")
                    return
                }
                DispatchQueue.main.async {
                    imageData = data
                    image = UIImage(data: imageData!)
                }
                }.resume()
            return image ?? #imageLiteral(resourceName: "ic_person_outline_white_2x")
        }
    }

Блок кода CellForItemAt

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! ImageCell
        let imageOption = self.imageData[indexPath.row]
        cell.iconImageView.image = icon(imageOption)
        return cell
        //imageData is an array with empty values that is populated with database values and subsequently reloaded
    }

Предполагаемый результат, как я уже говорил ранее, состоит в отображении изображений из firebaseStorage внутри collectionView.Мой код не отображает никаких ошибок, но всегда возвращает изображение по умолчанию, а также печатает imageURl, который, как я подтвердил, является точным http для изображения, которое я пытаюсь отобразить.

1 Ответ

0 голосов
/ 24 сентября 2019

Вам нужно кое-что узнать об асинхронном программировании.

Ваша функция возвращается немедленно, но URLSession.shared.dataTask(with: url!) занимает некоторое время.Временная шкала:

  1. изображение = ноль
  2. начало выборки данных
  3. возвращаемое изображение ??defaultImage
  4. выборка данных завершена (после того, как функция вернулась -> данные изображения потеряны)

Вместо немедленного возврата, обеспечьте закрытие, принимая изображение в качестве параметра в вашу функцию:

private func icon(_ imageURL: String, closure: (UIImage) -> Void)

и обновите ваш код до

URLSession.shared.dataTask(with: url!) { (data, response, error) in
    if error != nil {
        print("error")
        closure(#imageLiteral(resourceName: "ic_person_outline_white_2x"))
    }
    DispatchQueue.main.async {
        imageData = data
        image = UIImage(data: imageData!)
        closure(image)
    }
}.resume()

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

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

Надеюсь, это поможет!

...