ios - 我们如何将数据写入 firebase 实时数据库?尽管启用了读/写,但似乎不起作用

标签 ios swift firebase firebase-realtime-database

我创建了一个注册页面,用于获取用户的电子邮件、用户名、全名、密码和个人资料图片。问题是 firebase 身份验证工作完美,我也成功地将个人资料图片上传到 firebase 存储。我似乎无法将全名和用户名等其他属性写入 firebase REAL TIME DATABASE(不是 firestore)。

读写已经设置为真: 身份验证成功 图像存储成功 数据写入实时数据库不工作

没有抛出错误。只是没有数据被写入 使用 xcode 10.2.1

@objc func handleSignUp() {

        // properties
        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?.lowercased() 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 profileImg = self.plusPhotoBtn.imageView?.image else { return }

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

            // place image in firebase storage
            let filename = NSUUID().uuidString
            Storage.storage().reference().child("profile_images").child(filename).putData(uploadData)
            Storage.storage().reference().child("profile_images/\(filename).jpg").downloadURL(completion: { (url, error) in
                guard let profileImageUrl = url?.absoluteString else {return}
                guard let uid = Auth.auth().currentUser?.uid else {return}
                let dictionaryValues = ["name": fullName,
                                        "username": username,
                                        "profileImageUrl": profileImageUrl]
                let values = [uid: dictionaryValues]
                Database.database().reference().child("users").updateChildValues(values, withCompletionBlock: { (error, ref) in

                    guard let mainTabVC = UIApplication.shared.keyWindow?.rootViewController as? MainTabVC else { return }

                    // configure view controllers in maintabvc
                    mainTabVC.configureViewControllers()

                    // dismiss login controller
                    self.dismiss(animated: true, completion: nil)
                })

            })
        }
    }

最佳答案

您在代码中执行的顺序是问题的一部分。您真的应该使用 putData 之后的闭包来处理您放置的数据。

此外,当您创建用户时,闭包将包含一个用户变量,您可以从中获取 uid。所以不要这样做 guard let uid = Auth.auth().currentUser?.uid 因为用户 var 保证有效。

这是一个可以使用的通用模板

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

   // Upload the file to the path "images/rivers.jpg"
   let ref = storageRef.putData(data, metadata: nil) { (metadata, error) in
       guard let metadata = metadata else {
           print("error while uploading")
           return
       }
       // Metadata contains file metadata such as size, content-type.
       let size = metadata.size
       storageRef.downloadURL { (url, error) in
           guard let downloadURL = url else {
               print("an error occured after uploading and then downloading")
               return
           }

           let validDownloadUrl = downloadURL.absoluteString
           let uid = user.uid
           let dictionaryValues = ["name": fullName,
                                   "username": username,
                                   "profileImageUrl": validDownloadUrl]
           //write out your firebase data with a key of uid
       }
   }
}

关于ios - 我们如何将数据写入 firebase 实时数据库?尽管启用了读/写,但似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57017761/

相关文章:

ios - MPMediaItemArtwork 和 UITableView

iphone - 无法在 iPhone/IOS 5 上使用 [GKMatchmaker addPlayersToMatch] 添加其他玩家

oop - 为什么协议(protocol)的关联类型在 Swift 中不使用泛型语法?

ios - 快速高斯模糊图像

javascript - firebase - 使用电子邮件和密码创建用户返回未定义的uid

java - 进行查询以检索每个大陆的国家/地区 Firebase 实时数据库

ios - swift - 'PFObject is not convertible to NSString'

ios - AWS Cognito 匿名/ guest 用户的 IdentityId 更改

objective-c - 在 Swift 中使用 Objective-C 代码块

android - 在 firebase 中使用名称、用户名等创建新用户