问题描述
我正在尝试在Firestore中创建“个人资料”集合,以便在我的用户上存储的数据不仅仅是他们的电子邮件/姓名。 我一直坚持创建此文档并上传他们选择的个人资料图片(作为URL)。
func register() {
Auth.auth().createuser(withEmail: self.email,password: self.pass) { (res,err) in
if err != nil {
self.error = err!.localizedDescription
self.alert.toggle()
return
}
// Success registering a new user
guard let userUID = res?.user.uid else { return }
uploadImagetoFirestore(id: userUID,image: myImage) {
print("SUCCESS")
self.imageURL = downloadImageFromFirestore(id: userUID)
self.createuserDocument(id: userUID,imgurL: self.imageURL)
}
}
第一步是使用 uploadImagetoFirestore 函数将图片上传到Firebase存储上,我尝试使用完成处理程序来等待调用以下两个函数:
func uploadImagetoFirestore(id: String,image: UIImage,completion: () -> Void) {
let storageRef = storage.reference().child("images/\(id)/image.jpg").putData(image.jpegData(compressionQuality: 0.35)!,Metadata: nil) { (_,err) in
if err != nil {
print((err?.localizedDescription)!)
return
}
print("Success uploading picture to Firestore")
}
}
第二步是将新上传的图像下载到Firebase Storage上以获取URL:
func downloadImageFromFirestore(id: String) -> String {
let storageRef = storage.reference().child("images/\(id)/image.jpg")
storageRef.downloadURL { url,error in
if error != nil {
print("DEBUG: \((error?.localizedDescription)!)")
return
}
print("Success downloading picture from Firestore")
self.imageURL = "\(url!)"
}
return self.imageURL
}
第三步是使用ImageURL在Firestore中创建Profile集合:
func createuserDocument(id: String,imgurL: String) {
db.collection("profiles").document(id).setData([
"name": name,"surname": surname,"email": email,"shelter": isMember == true ? shelters[selectedShelter] : shelters[0],"photoURL": imgurL,"reputation": 0,"uuid": id
])
{ err in
if let error = err {
print("Error ading document: \(error)")
} else {
print("New profile document created in Firestore")
}
}
}
问题
我面临的问题是在我的“注册”函数中,从未调用 uploadImagetoFirestore 的完成块,因此函数createuserDocument都没有。
这是否是实现我想要的最佳方法(也就是使用注册时他们刚刚选择的图片的imageURL创建配置文件)?为什么我的完成区块没有被调用? (我在控制台上看不到“成功”字样。)
谢谢您的帮助!
亲切的问候, Jihaysse
解决方法
您需要调用要传递给uploadImageToFirestore
的完成处理程序闭包。
您可能还应该传递error
(如果有的话),以便您可以处理它。
func uploadImageToFirestore(id: String,image: UIImage,completion: (Error?) -> Void) {
let storageRef = storage.reference().child("images/\(id)/image.jpg").putData(image.jpegData(compressionQuality: 0.35)!,metadata: nil) { (_,err) in
completion(err)
}
}