Как я могу использовать URL для изображения в Swift? - PullRequest
1 голос
/ 15 января 2020

Я пытаюсь получить определенные данные из моей базы данных Firebase - изображение профиля. Как вы можете видеть, это из UITableViewCell. У меня есть @IBOutlet для моего imageView, который я хочу охватить.

Когда пробуждается представление, вы можете видеть, что я go прошел, и убедиться, что я могу получить информацию. Я знаю, как получить данные из Firebase, но не URL-адреса фотографий, а затем преобразовать их в саму фотографию.

Я не уверен, почему это не работает. Я получаю ошибку, и покажу ее ниже. Есть вероятность, что это происходит из-за распаковки URL-адресов или из-за того, что Firebase отформатирован неправильно, хотя я так думаю.

Сообщение об ошибке: Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

import UIKit
import FirebaseAuth
import FirebaseDatabase
import Firebase

class ProfileCellControler: UITableViewCell {

    @IBOutlet var name : UILabel!
    @IBOutlet var rating : UILabel!
    @IBOutlet var imageViewPro : UIImageView!

    var databaseRefer : DatabaseReference!
    var databaseHandle : DatabaseHandle!

    override func awakeFromNib() {
        super.awakeFromNib()

        var urlString = ""
        let urll = URL(string: urlString)!

        databaseRefer = Database.database().reference()
        let userID = Auth.auth().currentUser!.uid

        databaseHandle = databaseRefer.child("Users").child(userID).child("Profile").child("Profile Name").observe(.value, with: { (data) in
            print(String((data.value as? String)!))
            self.name.text = "\(String((data.value as? String)!))"
            print("Done")
        })

        databaseHandle = databaseRefer.child("Users").child(userID).child("Profile").child("Stars").observe(.value, with: { (data) in
            print(String((data.value as? String)!))
            if ((String((data.value as? String)!)) == "N/A") {
                self.rating.text = "No Rating"
            } else {
                self.rating.text = "\(String((data.value as? String)!)) ★"
            }
            print("Done")
        })

        databaseHandle = databaseRefer.child("Users").child(userID).child("Profile").child("Profile Image").observe(.value, with: { (data) in
            print(String((data.value as? String)!))
            print("Done \(String((data.value as? String)!))")
            urlString = (String((data.value as? String)!))
        })

        ImageService.downloadImage(withURL: urll) { (image) in
            self.imageViewPro.image = image
        }

        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

Take a look at my code, and use the code here if you don't understand

Ответы [ 2 ]

1 голос
/ 15 января 2020

Строка для URL не найдена, поскольку вы создаете вызов для загрузки изображения для вашего URL-адреса до того, как urll будет инициализировано значением из базы данных в:

  databaseHandle = databaseRefer.child("Users").child(userID).child("Profile").child("Profile Image").observe(.value, with: { (data) in
            print(String((data.value as? String)!))
            print("Done \(String((data.value as? String)!))")
            urlString = (String((data.value as? String)!))
        })

observe(.value, with: ) Асинхронная операция, поэтому

ImageService.downloadImage(withURL: urll) { (image) in
            self.imageViewPro.image = image
    }

Вызывается до разрешения observe(.value, with:). Я бы порекомендовал переместить обратный вызов для URL загрузки внутри завершения для .observe(:value, :with) или использовать большую центральную диспетчеризацию для лучшего управления потоком.

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

0 голосов
/ 15 января 2020

Импортируйте KingFisher, чтобы упростить свою жизнь, а затем ..

  1. Асинхронно загружайте строковое представление изображения из Firebase.
  2. Назначьте загруженное изображение для imageView с помощью .kf. setImage method.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...