Swift / Firestore:完成无法调用

问题描述

我正在尝试在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)
    }
}