Почему .putData не загружает изображение в Firebase Storage с помощью Swift? - PullRequest
0 голосов
/ 24 марта 2020

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

1 Ответ

0 голосов
/ 27 марта 2020

putData - это асинхронный вызов с функцией обратного вызова. Печать и возврат выполняются до того, как putData сможет вернуться.

Если вы установите точку останова на if let error = error, вы сможете увидеть результаты.

См. Аналогичный вопрос / ответ на { ссылка }

...