#arrays #swift #firebase #firebase-realtime-database #firebase-authentication
#массивы #swift #firebase #firebase-realtime-database #firebase-аутентификация
Вопрос:
Я пытаюсь получить изображения, сохраненные из базы данных (в данном случае я жестко запрограммировал точное изображение, которое я хочу получить из базы данных). У меня UIImage
инициированы две переменные: imageView
и rawImage
. ImageView использует SDWebImage
from FirebaseUI
для загрузки изображения, но я не знаю, как сохранить его в массив UIImage.
RawImage собирает данные из пути к точному изображению из Firebase. Я преобразую его в UIImage, но когда я хочу добавить его в свой массив UIImage, приложение вылетает.
class GalleryViewController:UIViewController{
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var rawImage: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
view.addVerticalGradientLayer(topColor: primaryColor, bottomColor: secondaryColor)
self.tabBarController?.tabBar.isHidden = true
retrievePicture()
}
func retrievePicture()
{
guard let user_email = Auth.auth().currentUser?.email else { return }
let storageRef = Storage.storage().reference()
// Reference to an image file in Firebase Storage
let reference = storageRef.child("(user_email)").child("/top").child("1.jpg")
// UIImageView in your ViewController
let imageView: UIImageView = self.imageView
// Placeholder image
let placeholderImage = UIImage(named: "placeholder.jpg")
//UploadViewController.Clothing.top_images.append(<#UIImage#>)
// Load the image using SDWebImage
imageView.sd_setImage(with: reference, placeholderImage: placeholderImage)
// this is the code for the rawImage portion I described above
reference.getData(maxSize: 1 * 1024 * 1024) { data, error in
if let error = error {
print("Error (error)")
} else {
let picture = UIImage(data: data!)
UploadViewController.Clothing.top_images.append(picture!)
}
}
// loading the image to the rawImage imageview
rawImage.image = UploadViewController.Clothing.top_images[0]
}
}
Ответ №1:
Если вы уже загружаете изображения с помощью SDWebImage, вы также можете добавить изображение в свой массив UIImage с этим.
Просто используйте SDWebImage с завершенным блоком, подобным этому
var arr_image = [UIImage]()
imageView.sd_setImage(with: reference_url, placeholderImage: UIImage(named: "placeholder.jpg"), options: options: [.highPriority]) { (img, error, cachtype, url) in
if img != nil{
arr_image.append(img) // append UIimage in array
}
}
Ответ №2:
Вы пропустили опции принудительного развертывания, и я предлагаю вам удалить !
использование, чтобы избежать сбоев, вместо этого используйте следующее
reference.getData(maxSize: 1 * 1024 * 1024) { data, error in
guard let data = data else {
print(error?.localizedDescription ?? "Check remote url or service")
return
}
if let picture = UIImage(data: data) {
UploadViewController.Clothing.top_images.append(picture)
} else {
print("Invalid image datan(String(data: data, encoding: .utf8))")
}
}
или следующий оператор if безопасен
if error == nil amp;amp; data != nil, let picture = UIImage(data: data!) {
UploadViewController.Clothing.top_images.append(picture)
}
Вы также можете попробовать path без косой черты, например:
let reference = storageRef.child("(user_email)/top/1.jpg")