Проблема с базой данных и хранилищем Firestore - PullRequest
0 голосов
/ 26 апреля 2020

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

 @IBAction func submitButtonTapped(_ sender: Any) {
    let db = Firestore.firestore()
    if let userName = Auth.auth().currentUser?.email {
        print(userName)

    func validateFields() -> String? {

                //Check that all fields are filled in
                if mustangNameTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" || blmTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" || roundedUpTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" || bioTextView.text?.trimmingCharacters(in: .whitespacesAndNewlines) == ""  {
                    return "Please fill in all fields"
                }
            return nil
        }

        let error = validateFields()

        if error != nil {
            // There is something wrong with the fields, show the error message
              let e = error
              print("Error in data, \(String(describing: e))")
              } else {

               //Create cleaned version of the data
               var mustangName = mustangNameTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
               let blm = blmTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
               let roundedUp = roundedUpTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
               let bio2 = bioTextView.text!.trimmingCharacters(in: .whitespacesAndNewlines)

            let storageRef = Storage.storage().reference().child("Profiles/\(mustangName)")
            if let uploadData = self.profileImageView.image!.pngData() {
            let metaDataForImage = StorageMetadata()
                metaDataForImage.contentType = "image/png"
                storageRef.putData(uploadData, metadata: metaDataForImage, completion: { (metadata, error) in
                        if error != nil {
                        print(error!)
                        return
                        }
                        print(metaDataForImage)
                        } )
                storageRef.downloadURL { (url, error) in
                    guard let downloadURL = url?.absoluteString else {
                           return
                          }
                    if url?.absoluteString != "" {
                        return
                    } else {
                    }
                            print(url!)
                            print("got url")
                    db.collection("Profile").document(mustangName).setData(["mustangName": mustangName,"blm": blm, "roundedUp": roundedUp, "bio2": bio2, "userName": userName, "profileImageURL": url?.absoluteString as Any]) {(error) in
                        if let e = error {
                        print("Error saving user data to firestore, \(e)")
                        } else {
                        print("Successfully saved data for: \(userName)")
                        }
                    }
                    func showError(_ message: String){
                    self.errorLabel.text = message
                    self.errorLabel.alpha = 1
                    }
                }
            }
        }
    }
    //close profile window and go to home screen
       let homeViewController = self.storyboard?.instantiateViewController(identifier: Constants.Storyboard.homeViewController) as? HomeViewController
          self.view.window?.rootViewController = homeViewController
          self.view.window?.makeKeyAndVisible()

}

1 Ответ

0 голосов
/ 26 апреля 2020

Я настоятельно рекомендую всегда форматировать код с помощью средства форматирования кода, поскольку это значительно облегчает выявление проблемы.

В этом случае вам необходимо переместить код, который получает URL-адрес загрузки и записывает его в Firestore в обработчик завершения, который запускается после завершения загрузки файла:

let storageRef = Storage.storage().reference().child("Profiles/\(mustangName)")
if let uploadData = self.profileImageView.image!.pngData() {
    let metaDataForImage = StorageMetadata()
    metaDataForImage.contentType = "image/png"
    storageRef.putData(uploadData, metadata: metaDataForImage, completion: { (metadata, error) in
        if error != nil {
            print(error!)
            return
        }
        print(metaDataForImage)

        storageRef.downloadURL { (url, error) in
            guard let downloadURL = url?.absoluteString else {
                return
            }
            if url?.absoluteString != "" {
                return
            }
            else {
            }
            print(url!)
            print("got url")
            db.collection("Profile").document(mustangName).setData(["mustangName": mustangName,"blm": blm, "roundedUp": roundedUp, "bio2": bio2, "userName": userName, "profileImageURL": url?.absoluteString as Any]) { (error) in
                if let e = error {
                    print("Error saving user data to firestore, \(e)")
                }
                else {
                    print("Successfully saved data for: \(userName)")
                }
            }
            func showError(_ message: String){
                self.errorLabel.text = message
                self.errorLabel.alpha = 1
            }
        }
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...