Как получить изображение из хранилища Firebase Swift 4 ios

Я пытаюсь получить изображение из хранилища 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

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

Vyacheslav 16.03.2019 22:32

@Вячеслав, о, спасибо, а у вас есть ответ для меня, пожалуйста?

Bob Ajjaja 16.03.2019 22:46

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

Mocha 17.03.2019 00:36

Вы создаете переменную контейнера изображения с помощью «var image: UIImage!». Вместо установки в него изображения из getData вы создаете новую переменную с тем же именем. Вот почему ты никуда не идешь.

El Tomato 17.03.2019 02:22

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

Jay 17.03.2019 14:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
232
1

Ответы 1

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

    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... произойдет задолго до того, как переменная изображения будет заполнена внутри замыкания. Код намного быстрее, чем интернет

Переместите этот оператор внутрь замыкания, сразу после 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 = внутри замыкания.

Другие вопросы по теме