Как извлечь изображение из хранилища firebase Swift 4 ios

#ios #swift #database #firebase #storage

#iOS #swift #База данных #огневая база #Хранение #firebase

Вопрос:

Я пытаюсь извлечь изображение из хранилища firebase, но по какой-то причине изображение, которое я извлекаю, всегда является nil .

 var ref: DatabaseReference!
var storageRef: StorageReference!
var hallData = [Hall]()
override func viewDidLoad() {
    let refHandle = Database.database().reference().child("hallData").observe(DataEventType.value, with: { (snapshot) in
        let postDict = snapshot.value as? [String : AnyObject] ?? [:]
         let values = Array(postDict.values)
        //print(values)
        let valueDict = values as! [[String:Any]]

        for i in valueDict
        {
            var name = i["name"] as! String
            var address = i["address"] as! String
            var capacity = i["capacity"] as! String
            var decorations = i["decorations"] as! String
            var highPrice = i["highPrice"] as! String
            var lowPrice = i["lowPrice"] as! String
            var catering = i["catering"] as! String
            var email = i["email"] as! String
            self.storageRef = Storage.storage().reference().child("images").child(email)
            var image: UIImage!
            // Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes)

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

                if let error = error {
                    print("PLASESEE")
                    print(error.localizedDescription)
                    // Uh-oh, an error occurred!
                } else {
                    // Data for "images/island.jpg" is returned
                    let image = UIImage(data: data!)
                }
            }
        print(image)
            self.hallData.append(Hall(name2: name, capacity2: capacity, lowPrice2: lowPrice, highPrice2: highPrice, catering2: catering,decorations2: decorations, address2:address, image2: image, email2: email))
        }
    })
}
  

Я не понимаю, что я делаю не так, я следил за api в хранилище firebase, просмотрел множество руководств, но я продолжаю получать nil

Комментарии:

1. Привет, Боб. Прежде всего, пожалуйста, не используйте слова с заглавной буквы.

2. @Vyacheslav о, спасибо, но у вас есть ответ для меня, пожалуйста

3. Вы получаете сообщение об ошибке или изображение равно нулю для island.png?

4. Вы создаете переменную контейнера изображения с ‘var image: UIImage!’. Вместо того, чтобы устанавливать изображение из getData на него, вы создаете новую переменную с тем же именем. Вот почему вы никуда не идете.

5. @ElTomato Хороший улов. Другая проблема заключается в том, где назначается переменная — вне закрытия.

Ответ №1:

Проблема в том, что вы пытаетесь работать с переменным изображения вне замыкания getData.

     self.storageRef.getData(maxSize: 1 * 1024 * 1024) { data, error in
            if let error = error {
                print("PLASESEE")
                print(error.localizedDescription)
                // Uh-oh, an error occurred!
            } else {
                // Data for "images/island.jpg" is returned
                let image = UIImage(data: data!)
            } <- closure ends here and image is only valid above this
        }
        print(image) <- image may not be populated at this point
        self.hallData.append... image
    }
  

Это закрытие является асинхронным, и вызов self.hallData.append... произойдет задолго до того, как в закрытии будет заполнен параметр image var. Код намного быстрее, чем Интернет

Переместите это утверждение внутрь закрытия, сразу после let image = и оно должно сработать.

        self.storageRef.getData(maxSize: 1 * 1024 * 1024) { data, error in
           if let error = error {
               print("An error occurred in downloading the image")
               print(error.localizedDescription)
           } else {
               let image = UIImage(data: data!)
               self.hallData.append... image
               //reload your tableView or UI as self.hallData is now valid
           }
       }
  

Если вы сделаете это таким образом, предыдущее var image: UIImage! может быть удалено, поскольку у него нет функции. В противном случае удалите значение let перед значением let image = в закрытии.