Как я могу хранить данные, полученные из Firebase, преобразованные в UIImage, в массив UIImage?

#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")