Почему после обновления модулей я продолжаю получать Значение типа StorageMetadata не имеет члена downloadURL? - PullRequest
0 голосов
/ 27 апреля 2020

Я знаю, что это потому, что StorageMetadata больше не используется. Я видел другие общие ответы c на похожие вопросы, указывающие на эту документацию по базе данных: https://firebase.google.com/docs/storage/ios/upload-files Я пытался применить его к своему коду, но он не работает. Как мне применить его к моей текущей функции?

{




        let uid = Auth.auth().currentUser!.uid
        let newPostRef = Database.database().reference().child("people").child(uid).child("PhotoPosts")
        let newPostRef1 = Database.database().reference().child("people").child(uid).child("PhotoPosts1")


        let newPostKey = newPostRef.key



        if let imageData = image.jpegData(compressionQuality: 0.001){

            let imageStorageRef = Storage.storage().reference().child("images").child(uid)


            let newImageRef = imageStorageRef.child(newPostRef.key!)
            let newImageRef1 = imageStorageRef.child(newPostRef1.key!)


            newImageRef.putData(imageData).observe(.success, handler: {(snapshot) in
                self.imageDownloadURL = snapshot.metadata?.downloadURL()?.absoluteString
                newPostRef.setValue(self.imageDownloadURL as Any)


            })



            newImageRef1.putData(imageData).observe(.success, handler: {(snapshot) in
                self.imageDownloadURL = snapshot.metadata?.downloadURL()?.absoluteString

                let keyToPost = Database.database().reference().child("people").child(uid).childByAutoId().key
                let f1: [String: Any] = [(keyToPost) : self.imageDownloadURL as Any]

                newPostRef1.updateChildValues(f1)




                               })


            let caption = ServerValue.timestamp() as! [String : Any]
            Database.database().reference().child("people").child(uid).child("caption").setValue(caption)


        }

    }

Как я уже упоминал, я попытался применить документацию firebase к своей функции, как показано ниже. Это все еще дает в основном ту же ошибку. Куда я иду не так?

 func save() {




        let uid = Auth.auth().currentUser!.uid
        let newPostRef = Database.database().reference().child("people").child(uid).child("PhotoPosts")
        let newPostRef1 = Database.database().reference().child("people").child(uid).child("PhotoPosts1")


        let newPostKey = newPostRef.key



        if let imageData = image.jpegData(compressionQuality: 0.001){

            let imageStorageRef = Storage.storage().reference().child("images").child(uid)


            let newImageRef = imageStorageRef.child(newPostRef.key!)
            let newImageRef1 = imageStorageRef.child(newPostRef1.key!)
            newImageRef.downloadURL { url, error in
              if let error = error {



              } else {

                newImageRef.putData(imageData).observe(.success, handler: {(snapshot) in
                                  self.imageDownloadURL = snapshot.metadata?.downloadURL()?.absoluteString
                                  newPostRef.setValue(self.imageDownloadURL as Any)


                              })
                // Here you can get the download URL for 'simpleImage.jpg'
              }
            }

....

ОБНОВЛЕНИЕ после первого ответа: это то, что я пробовал для двойной записи базы данных:

     newImageRef1.putData(imageData).observe(.success, handler: {(snapshot) in
                                      newImageRef1.downloadURL { (url, error) in
                                        guard let downloadURL = url else {
                                          return
                                        }
                                        let keyToPost = Database.database().reference().child("people").child(uid).childByAutoId().key
                                        let f1: [String: Any] = [(keyToPost) : self.imageDownloadURL as Any]

                                        newPostRef1.updateChildValues(f1)
                                      }
                                    })

Я получаю следующую ошибку при let f1: Cannot convert value of type 'String?' to expected dictionary key type 'String'

1 Ответ

1 голос
/ 27 апреля 2020

Вы получаете:

Значение типа 'StorageMetadata' не имеет члена 'downloadURL'

Если вы посмотрите документацию для StorageMetadata вы увидите, что он действительно не имеет downloadURL члена. Этот элемент был удален в обновлениях SDK от мая 2018 года, поэтому он давно отсутствует.

Правильный способ получения URL-адреса для загрузки показан в документации по при загрузке данных :

// Upload the file to the path "images/rivers.jpg"
let uploadTask = riversRef.putData(data, metadata: nil) { (metadata, error) in
  guard let metadata = metadata else {
    // Uh-oh, an error occurred!
    return
  }
  // Metadata contains file metadata such as size, content-type.
  let size = metadata.size
  // You can also access to download URL after upload.
  riversRef.downloadURL { (url, error) in
    guard let downloadURL = url else {
      // Uh-oh, an error occurred!
      return
    }
  }
}

В вашем случае это было бы что-то вроде:

newImageRef.putData(imageData).observe(.success, handler: {(snapshot) in
  newImageRef.downloadURL { (url, error) in
    guard let downloadURL = url else {
      return
    }
    newPostRef.setValue(url)
  }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...