Google cloud firestore 如何创建用户';注册Firestore/SwiftUI时的个人资料信息文档?

Google cloud firestore 如何创建用户';注册Firestore/SwiftUI时的个人资料信息文档?,google-cloud-firestore,swiftui,Google Cloud Firestore,Swiftui,快速编辑:用户完全可以被授权,只是不需要创建文档 我觉得这太复杂了。我试着到处搜索,但我没能找到一个不强迫我重新构建应用程序的解决方案。除此之外,其他一切都正常工作,我觉得我只需要将对createUserDoc函数的调用放在正确的位置,但我不知道在哪里。这就是我现在拥有的。我试着尽可能多地撇去填充物。注册表格是您的通用文本字段VStack,因此我认为不需要它 struct User: Codable, Identifiable { var id: String var email

快速编辑:用户完全可以被授权,只是不需要创建文档

我觉得这太复杂了。我试着到处搜索,但我没能找到一个不强迫我重新构建应用程序的解决方案。除此之外,其他一切都正常工作,我觉得我只需要将对
createUserDoc
函数的调用放在正确的位置,但我不知道在哪里。这就是我现在拥有的。我试着尽可能多地撇去填充物。注册表格是您的通用文本字段VStack,因此我认为不需要它

struct User: Codable, Identifiable {
    var id: String
    var email: String
    var firstName: String = ""
    var lastName: String = ""
}

class SessionStore: ObservableObject {
    private let db = Firestore.firestore()
    @Published var session: User?
    var handle: AuthStateDidChangeListenerHandle?
    let authRef = Auth.auth()
    
    func listen() {
        handle = authRef.addStateDidChangeListener({ auth, user in
            if let user = user {
                self.session = User(id: user.uid, email: user.email!)
            } else {
                self.session = nil
            }
        })
    }
 
    // ...

    func signUp(firstName: String, lastName: String, email: String, password: String) {
        authRef.createUser(withEmail: email, password: password) { result, error in
            guard error != nil else { return }
            guard let user = result?.user else { return }
            
            // This is what I don't know where to put
            self.db.collection("Users").document(user.uid).setData([
                "firstName": firstName,
                "lastName": lastName,
                "email": email,
                "id": user.uid

            // I've also tried using the createUserDoc function
            let newUser = User(id: user.uid, email: email, firstName: firstName, lastName: lastName)
            self.createUserDoc(newUser: newUser)
            
        ])

        }
        
    }

    // ...
    
    func createUserDoc(newUser: User) {
        let _ = db.collection("Users").document(newUser.id).setData([
                "firstName": newUser.firstName,
                "lastName": newUser.lastName,
                "email": newUser.email,
                "id": newUser.id
        ])
    }
}
基于搜索,我想我知道哪里出了问题,我只是不知道该怎么办。我认为在执行
createUserDoc
之前必须完成
signUp
函数。但是我首先需要引用该用户的uid来创建文档。我有点(勉强)想到了一个快速解决方案,通过创建一个一次性类,只用于创建一个文档,但这感觉是错误的和冗余的,而且我不得不引入一堆毫无意义的一次性变量和额外的代码


理想情况下,注册和创建文档应该在一个功能中完成,对吗?我该怎么做呢?如果可能的话,我真的希望能提出一个最小化重组的建议。一周来,我经历了足够多的重组,终于有了一些可以理解的东西。

多亏了@jnpdx,我才得以修复。原来我必须更改
保护错误!=如果let error=error
,则返回到
的nil
语句。我不知道为什么会这样,以前也没有,但让这句话提醒所有新手:每隔一段时间构建和测试一次,即使你的笔记本电脑在构建过程中处于爆炸的边缘。

你确定没有出错吗?您只是返回,没有在
guard
语句中打印错误或任何内容。@jnpdx这是一个好问题,在多次重新启动之后,我并不太关心如何实现错误处理。你会发现的soon@jnpdx事实证明,它被警卫的错误陈述缠住了。我把它改为if let error=error,一切都按预期进行了。之前无法说明问题是什么,但无论如何,感谢您提醒我要更频繁地构建和测试,从现在起,我们将做得更多。哦,是的——更仔细地看,您有
guard let error!=nil
应该是相反的:
guard error==nil
噢,天啊,我的Python背景很难适应Swift,谢谢