Я пытаюсь получить изображение из хранилища 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
@Вячеслав, о, спасибо, а у вас есть ответ для меня, пожалуйста?
Вы получаете сообщение об ошибке или изображение для island.png равно нулю?
Вы создаете переменную контейнера изображения с помощью «var image: UIImage!». Вместо установки в него изображения из getData вы создаете новую переменную с тем же именем. Вот почему ты никуда не идешь.
@ElTomato Хороший улов. Другая проблема заключается в том, где присваивается var - вне замыкания.





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