我创建了一个注册页面,用于获取用户的电子邮件、用户名、全名、密码和个人资料图片。问题是 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/