Я пытаюсь получить URL изображения, которое я загрузил в хранилище, коды, которые я нахожу, очень старые - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь получить URL изображения, которое я загрузил в хранилище (https://firebasestorage.googleapis.com/v0/b/mismascotasgb-oficial.appspot.com/o/petImage%2Fq5ABEFEWZNX7PqTJZ9Nm.jpg?alt=media&token=12b8c0b7-d65a -441 c -a2d8-cfb55cf8498d).

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

        let db = Firestore.firestore()
        let newDocument = db.collection("pets").document()
        pid = newDocument.documentID

        pid = newDocument.documentID
        let pidJPG = pid + ".jpg"

        let storageRef = RefStorage.petImages.reference().child(pidJPG)

        if let uploadData = self.imagePet?.jpegData(compressionQuality: 0.2){

            storageRef.putData(uploadData, metadata: nil) { (metadata, error) in
                if error != nil {
                    print("error: \(String(describing: error))")
                    return
                }
            }

            urlImagePet = storageRef.description
            storageRef.downloadURL(completion: {(url, error) in
                if error != nil {
                 print(error!.localizedDescription)
                   return
                }
                self.image = url!.absoluteString
            })
        }
        db.collection("pets").document(pid).setData(toDictionary()) { err in
            if let err = err {
                print("\n--------------------------------------")
                print("Error writing document: \(err)")
                print("--------------------------------------\n")
            } else {
                print("\n--------------------------------------")
                print("Document successfully written!")
                print("--------------------------------------\n")
            }
        }
    }



func toDictionary() -> [String : Any]{
        return[
            "pid" : pid,
            "urlImagePet" : urlImagePet,
            "image" : image
        ]

    }

1 Ответ

1 голос
/ 21 января 2020

Вызовы putData, downloadURL и setData являются асинхронными. Это означает, что результат этих вызовов доступен только в обработчиках их завершения. Чтобы правильно использовать эти результаты, вам нужно вложить вызовы, как вы уже это делаете для обработки ошибок.

Так что-то вроде:

if let uploadData = self.imagePet?.jpegData(compressionQuality: 0.2) {

    storageRef.putData(uploadData, metadata: nil) { (metadata, error) in
        if error != nil {
            print("error: \(String(describing: error))")
            return
        }

        // once you get here, the data is uploaded to Cloud Storage, and 
        // you can get the download URL

        storageRef.downloadURL(completion: {(url, error) in
            if error != nil {
                print(error!.localizedDescription)
                return
            }

            // once you get here, you have the download URL, so you can
            // write it to the database

            let data = [
                "pid" : newDocument.documentID,
                "urlImagePet" : storageRef.description,
                "image" : url!.absoluteString
            ]

            newDocument.setData(data) { err in
                if let err = err {
                    print("Error writing document: \(err)")
                } else {
                    print("Document successfully written!")
                }
            }

        })

    }


}
...