【问题标题】:How to manage user data如何管理用户数据
【发布时间】:2020-05-14 14:11:48
【问题描述】:

我目前正在学习如何使用 SwiftUI 来使用 Firebase 和 Firestore 数据库。 我想知道组织和管理用户数据的最佳方式是什么。

我已经做了一些研究,但我仍然很困惑。

在我的测试项目中,我成功实现了 Firebase 电话身份验证,但我的数据管理一团糟。我在电话输入视图的按钮操作中调用 firebase,然后重定向到我的验证视图,在那里我检查用户是否在按钮操作中也给了我正确的验证号。

我听说过 Model、View、ViewController 模型,我正在尝试实现它。 这意味着,我需要一个包含所有用户属性的 User Struct 才能在我的整个应用程序中读取它们?

我想知道在哪里可以找到关于如何在我的 swift 应用程序中管理和存储用户数据的好文档。我真的很迷茫,我要去各个方向,我需要集中精力。

【问题讨论】:

    标签: firebase swiftui


    【解决方案1】:

    如果您想存储非常基本的用户数据,例如他们的姓名和电子邮件,您可以使用 FIRUser 的内置函数。添加 displayName 和 emailAddress 可以使用 Swift 完成,如下所示:

    let changeRequest = Auth.auth().currentUser?.createProfileChangeRequest()
    changeRequest?.displayName = displayName
    changeRequest?.commitChanges { (error) in
      // ...
    }
    

    对于电子邮件:

    Auth.auth().currentUser?.updateEmail(to: email) { (error) in
      // ...
    }
    

    但是,如果您想存储特定于应用功能的自定义用户数据,我建议您使用 Firebase 提供的数据库平台 Firestore。

    使用本教程使用 Firestore 设置您的应用:

    https://firebase.google.com/docs/firestore/quickstart

    设置好 Firestore 后,您想为您的用户创建一个集合,每个用户都会有一个包含其数据的文档,并且可以使用他们的 UID 来获取该文档。

    当你创建一个用户时,你还想在你的 Firestore 数据库的用户集合中创建一个 doc,当你想访问用户数据时,你想读回这个数据。

    为此,遵守 ObservableObject 的类效果很好。

    确保导入 FirebaseFirestore 和 FirebaseAuth。

    首先创建一个自定义结构来保存我们用户的值。这些是完全可定制的,我只是包括一些例子。这些可以非常复杂并且专门针对您的应用功能。

    struct CustomUser {
        var name: String
        var favouriteColor: String
        var dateCreated: Date
        var age: Int
    }
    

    创建一个这样的类

    class UserFetch: ObservableObject {
        // ...
    }
    

    然后我们需要一个变量来保存我们的用户。为了确保它被更新,我们使用@Published 属性包装器。让我们还添加一个变量,为我们的用户保存我们的 Firestore 集合。

    class UserFetch: ObservableObject {
        @Published var user: CustomUser?
    
        var collection: CollectionReference = Firestore.firestore().collection("users")
        // ...
    }
    

    现在我们要编写一个将数据写入文档的函数:

    class UserFetch: ObservableObject {
        @Published var user: CustomUser?
    
        var collection: CollectionReference = Firestore.firestore().collection("users")
    
        func createUser(withName: String, favouriteColor: String, dateCreated: Date, age: Int, forUserID: String) {
            self.collection.document(forUserID).setData(["name": withName,
                                                         "favouriteColor": favouriteColor,
                                                         "dateCreated": dateCreated,
                                                         "age": age]) { (error) in
                if error != nil {
                    print((error?.localizedDescription)!)
                    return
                } else { print("CREATED DATA - USER: \(forUserID)") }
            }
        }
        // ...
    }
    

    当你创建一个用户时,调用这个函数。

    现在我们需要从 Firestore 读取用户

    class UserFetch: ObservableObject {
        @Published var user: CustomUser?
    
        var collection: CollectionReference = Firestore.firestore().collection("users")
    
        func createUser(withName: String, favouriteColor: String, dateCreated: Date, age: Int, forUserID: String) {
            self.collection.document(forUserID).setData(["name": withName,
                                                         "favouriteColor": favouriteColor,
                                                         "dateCreated": dateCreated,
                                                         "age": age]) { (error) in
                if error != nil {
                    print((error?.localizedDescription)!)
                    return
                } else { print("CREATED DATA - USER: \(forUserID)") }
            }
        }
        
        func fetch(uid: String) {
            self.collection.document("\(uid)").addSnapshotListener { (snapshot, error) in
                if error != nil {
                    print((error?.localizedDescription)!)
                    return
                } else {
                    print("READ USER DATA")
                }
            
                self.user = CustomUser(name: snapshot?.get("name") as? String ?? "", favouriteColor: snapshot?.get("favouriteColor") as? String ?? "", dateCreated: (snapshot?.get("dateCreated") as! Timestamp).dateValue(), age: snapshot?.get("age") as? Int ?? 0)
            }
        }
    }
    

    最后,添加一个读取这些数据的初始化器。

    class UserFetch: ObservableObject {
        init(uid: String) {
            fetch(uid: uid)
        }
        @Published var user: CustomUser?
    
        var collection: CollectionReference = Firestore.firestore().collection("users")
    
        func createUser(withName: String, favouriteColor: String, dateCreated: Date, age: Int, forUserID: String) {
            self.collection.document(forUserID).setData(["name": withName,
                                                         "favouriteColor": favouriteColor,
                                                         "dateCreated": dateCreated,
                                                         "age": age]) { (error) in
                if error != nil {
                    print((error?.localizedDescription)!)
                    return
                } else { print("CREATED DATA - USER: \(forUserID)") }
            }
        }
        
        func fetch(uid: String) {
            self.collection.document("\(uid)").addSnapshotListener { (snapshot, error) in
                if error != nil {
                    print((error?.localizedDescription)!)
                    return
                } else {
                    print("READ USER DATA")
                }
            
                self.user = CustomUser(name: snapshot?.get("name") as? String ?? "", favouriteColor: snapshot?.get("favouriteColor") as? String ?? "", dateCreated: (snapshot?.get("dateCreated") as! Timestamp).dateValue(), age: snapshot?.get("age") as? Int ?? 0)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-13
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 2018-06-01
      • 2012-06-26
      • 2016-07-22
      相关资源
      最近更新 更多