Swift 注册过程中InvalidFirebaseData

Swift 注册过程中InvalidFirebaseData,swift,firebase,firebase-realtime-database,firebase-authentication,firebase-storage,Swift,Firebase,Firebase Realtime Database,Firebase Authentication,Firebase Storage,目前,我在注册过程中使用Firebase身份验证、数据库和存储的组合 @objc func handleSignUp() { guard let email = emailTextField.text else { return } guard let password = passwordTextField.text else { return } guard let fullName = fullNameTextField.text else

目前,我在注册过程中使用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]

因此,我可以编译和运行该项目

但是,当我按下注册按钮并因此运行给定功能时,控制台显示此错误:

2019-09-30 19:15:13.049986+0200 5iveli0ns[965:28839][]西北连接接收内部块调用接收回复失败,错误为“操作已取消”

最后,我收到一个运行时异常:

***由于未捕获的异常“InvalidFirebaseData”,正在终止应用程序,原因:”(updateChildValues:withCompletionBlock:)无法在profileImageURL处存储类型为u SwiftValue的对象。只能存储NSNumber、NSString、NSDictionary和NSArray类型的对象。'

这是与xCode 11/Firebase 5.x.x相关的问题吗?

let profileImageURL = uploadReference.downloadURL
字符串,然后将其输入dictionaryValues数组


我希望这有助于

一般说来,字典从它们包含的数据中推断出它们的结构。比如说

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: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
}
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
}