InvalidFirebaseData во время процесса подписки - PullRequest
0 голосов
/ 30 сентября 2019

В настоящее время я использую комбинацию аутентификации, базы данных и хранилища Firebase для моего процесса подписки.

@objc func handleSignUp() {

        guard let email = emailTextField.text else { return }
        guard let password = passwordTextField.text else { return }
        guard let fullName = fullNameTextField.text else { return }
        guard let username = usernameTextField.text else { return }

        Auth.auth().createUser(withEmail: email, password: password) { (user, error) in

            //handle error
            if let error = error {

                print("Failed to create user with error", error.localizedDescription)
                return
            }

            //set profile image
            guard let profileImage = self.plusPhotoButton.imageView?.image else { return }

            //upload data
            guard let uploadData = profileImage.jpegData(compressionQuality: 0.3) else { return }

            //place image in firbase storage
            let filename = NSUUID().uuidString

            let storage = Storage.storage()
            let storageReference = storage.reference()

            let imagesReference = storageReference.child("profile_images")

            let uploadReference = imagesReference.child(filename)
            uploadReference.putData(uploadData, metadata: nil) { (metadata, error) in

                //handle error
                if let error = error {

                    print("Failed to upload image to Firebase Storage with error", error.localizedDescription)
                }

                //profile image url
                let profileImageURL = uploadReference.downloadURL

                //user id
                let uid = user?.user.uid

                let dictionaryValues = ["name": fullName, "username": username, "profileImageURL": profileImageURL]

                let values = [uid: dictionaryValues]

                //save user info to database
                Database.database().reference().child("users").updateChildValues(values) { (error, ref) in

                    print("Successfully created user and saved information to database")

                }
            }
        }

Это должен быть код, который должен работать нормально. Однако xCode выдает мне эту ошибку:

Литерал гетерогенной коллекции может быть выведен только как '[String: Any]';добавить явную аннотацию типа, если это преднамеренно

и советует мне изменить

let dictionaryValues = ["name": fullName, "username": username, "profileImageURL": profileImageURL]

на

let dictionaryValues = ["name": fullName, "username": username, "profileImageURL": profileImageURL] as [String : Any]

В результате я могу скомпилировать изапустить проект.

Однако, когда я нажимаю кнопку регистрации и, следовательно, запускаю данную функцию, консоль показывает эту ошибку:

2019-09-30 19: 15: 13.049986+0200 5iveli0ns [965: 28839] [] nw_connection_receive_internal_block_invoke [C2] Не удалось получить ответ с ошибкой «Операция отменена»

, и в конце я получаю исключение времени выполнения:

*** Завершение работы приложения из-за необработанного исключения «InvalidFirebaseData», причина: «(updateChildValues: withCompletionBlock :) Не удается сохранить объект типа __SwiftValue в profileImageURL. Может хранить только объекты типа NSNumber, NSString, NSDictionary и NSArray. '

Это проблема, связанная с xCode 11 / Firebase 5.xx?

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Вообще говоря, словари определяют свою структуру по данным, которые они содержат. Например,

let dict = [
   "name": "Leroy",
   "fav_food": "Pizza"
]

- это словарь [String: String]

Аналогично

let dict = [
   "name": "Leroy"
   "age": 25
]

- это словарь [String: Int].

То, что у вас есть

let dict = [
   "name": "Leroy",
   "username": "some username"
   "profileImageUrl": URL //oops, not a string, its a URL!
]

Когда значения словаря являются согласованными, они могут быть определены [String: String]. Однако, когда типы значений будут различаться, они будут [String: Any]

Другая проблема заключается в том, что Firebase не поддерживает тип URL, поэтому даже если вы использовали словарь [String: Any],Firebase будет жаловаться - как показывает ошибка.

Исправить несложно - просто используйте путь, который является строкой URL

if let url = uploadReference.downloadURL {
    let path = url
    let dict = [
       "name": "Leroy",
       "username": "some username",
       "path": path //it's a string
    ]
    //write dict to Firebase
}
0 голосов
/ 30 сентября 2019

COnvert

let profileImageURL = uploadReference.downloadURL

в String, а затем введите его в массив dictionaryValues.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...