У меня есть простое быстрое приложение, в котором пользователь выбирает изображение из галереи, в дополнение к вводу нескольких данных. При нажатии на кнопку Сохранить выбранное изображение должно быть загружено в хранилище Firestore. Я реализовал ту же логику c, описанную здесь https://firebase.google.com/docs/storage/ios/upload-files. Когда я вызываю «.putData (data, metadata: nil)», ничего не происходит, и никакой ошибки не возвращается. Вот фрагмент кода:
func uploadImage(imageView: UIImageView) -> String {
// Variable for my image url
var urlString: String
urlString = ""
storage = Storage.storage()
guard let image = imageView.image,
let imageData = image.jpegData(compressionQuality: 1.0) else {
print ("no image uploaded")
return ""
}
let imageName = String (Int64((NSDate().timeIntervalSince1970 * 1000.0).rounded())) + ".jpg"
let imageRef = storage.reference().child(Constants.IMAGES_PATH).child(imageName)
// QUOTE : THIS PART DOES NOT GIVE ANY FEEDBACK. NONE OF THE PRINTS INSIDE IT IS EXECUTED
let uploadTask = imageRef.putData(imageData, metadata: nil) { (metadata, error) in
if let error = error {
// Uh-oh, an error occurred!
print(error)
return
}
imageRef.downloadURL { (url, error) in
guard let downloadURL = url else {
print ("error")
return
}
urlString = downloadURL.absoluteString
print("Downloaded image URL ", urlString)
}
}
// UNQUOTE
print ("after uploadTask", imageRef.downloadURL) // THE URL IS ALWAYS EMPTY ""
return urlString
}
Я установил точку останова отладчика, которая показывает, что код внутри uploadTask не выполняется, выполняется только uploadTask и все внутри пропускается.
Функция uploadImage вызывается после выбора изображения следующим образом:
var image = uploadImage(imageView: imageView)
Изображение выбрано здесь (это прекрасно работает):
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
imageView.contentMode = .scaleAspectFit
imageView.image = pickedImage
print("image chosen")
}
dismiss(animated: true, completion: nil)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
dismiss(animated: true, completion: nil)
}
Я инициализировал как вот, что должно быть в порядке:
import UIKit
import os.log
import FirebaseFirestore
import Firebase
class DisplayMediumViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
var storage: Storage!
override func viewDidLoad() {
super.viewDidLoad()
// Additional setup after loading the view.
imagePicker.delegate = self
// Create tap gesture recognizer
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(DisplayMediumViewController.imageTapped(gesture:)))
// Aadd it to the image view;
imageView.addGestureRecognizer(tapGesture)
// Make sure imageView can be interacted with by user
imageView.isUserInteractionEnabled = true
}
Я много искал в inte rnet и пробовал разные способы его реализации, но ни один из них не был успешным. Было бы здорово, если у кого-то есть подсказка, почему «uploadTask = imageRef.putData» не загружает изображение и не возвращает downloadURL.