我应该如何配置我的应用以跨类保留 Firebase 用户数据?

Posted

技术标签:

【中文标题】我应该如何配置我的应用以跨类保留 Firebase 用户数据?【英文标题】:How should I configure my app to persist Firebase user data across classes? 【发布时间】:2017-05-18 16:28:33 【问题描述】:

所以在我的应用程序中,我有一个视图控制器,允许用户在UITextFields 中输入电子邮件和密码,然后我使用 Firebase 登录用户并识别他们与电子邮件关联的 uid。我还有一个名为 User 的结构,其中包含用户名和用户 ID 字符串以及一个字符串数组(我没有提供它的代码,因为我认为没有必要,但如果你需要它,请告诉我) .

我有一个类级变量

var currentUser:User? = nil

在登录按钮的 @IBaction 方法中,我使用上述 uid 执行以下操作以使用 FIRDataSnapshot 初始化用户:

    FIRAuth.auth()?.signIn(withEmail: usernameTextBox.text!, password: passwordTextBox.text!)  (user, error) in
        if error == nil 
            //Valid Email and Password
            let userID = FIRAuth.auth()?.currentUser?.uid

            self.childRef.observe(.value, with:  snapshot in
                for item in snapshot.children.allObjects as! [FIRDataSnapshot] 
                    let dict = item.value as! Dictionary<String,Any>
                    if (dict["UserID"] as? String == userID) 
                        self.currentUser = User(snapshot: item) //<----This is where currentUser is assigned the new User
                    
                    //currentUser = User(snapshot: )
                    self.performSegue(withIdentifier: "LoginSegue", sender: sender)
                
            )

        
        else 
            //Error stuff
        
    

我的问题是在另一个类中我需要访问 currentUser 变量(添加朋友等),但我不知道如何去做。我也无法在其他类中从 Firebase 中提取用户数据,因为只有上述那个可以访问我需要确定要使用和修改哪些用户信息的 UserID。

我不能使用prepareForSegue,因为在您登录的视图控制器和其他视图控制器之间有一个 SWRevealViewController,而 SWRevealViewController 是用我不熟悉的 Objective-C 编写的。我的研究表明,一些可能性可能是全局变量和单例,但许多程序员认为使用其中任何一种都是不安全的做法。还使用NSUserDefaults(我认为它们在Swift 3 中已重命名为UserDefaults)是另一个潜在的解决方案吗?我愿意接受任何建议。

提前致谢。

【问题讨论】:

除非其他人提到另一种方法,否则最好使用 NSUserdefaults,除非您可以从基础 VC 访问新 VC 的实例化。由于这是一个自定义对象,您可以使用 NSData 来存档、保存它,然后取消存档并在新的 VC 中使用它。 ***.com/questions/29986957/… 如果我正确理解了您的问题,您可以在任何视图中执行此操作。 if let currentUser = FIRAuth.auth()?.currentUser let email = currentUser.email // 获取更多用户数据 大多数开发人员使用UserDefaults 来保存和获取用户数据,因为它非常简单。如果您想将用户凭据保存在更安全的地方,请使用KeyChain 感谢@MagoNicolasPalacios,这正是我想要的。 没问题,我将其作为答案发布给您,以将其标记为已解决。 【参考方案1】:

有多种方法可以使用相同的用户数据或跨多个类获取数据。这取决于数据的大小和使用情况。

这里有一些简单的方法来实现这一点:

    您可以使用UserDefaults跨多个类持久化数据,即使在重新启动应用后,数据也会在重新启动后保留,直到您清除它为止。

    您可以像 AppDelegate 一样使用 Singleton 类,添加一些相关属性,例如DictionaryArray 并从任何类访问它。

    在推送ViewController 时将数据从一个类传递到另一个类。

我认为如果您不需要坚持使用Singleton 类就足以解决您的问题。您还可以在 Singleton 类中编写通用方法,这样您就无需一遍又一遍地重写相同的方法来在多个类中使用。常见的Static StringsMacros 也是如此。

希望对你有帮助。

【讨论】:

【参考方案2】:

您可以在任何视图中执行此操作。如果让 currentUser =

FIRAuth.auth()?.currentUser  
let email = currentUser.email // 
get more user data 

【讨论】:

以上是关于我应该如何配置我的应用以跨类保留 Firebase 用户数据?的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候需要提交我的应用以供 Facebook 审核(当只有少数人会使用它时)?

Swift - Firebase 在 Firestore 中获取 Facebook 好友 UID

如何在我的应用程序中接收共享内容?

如何在反应 jsx 中有一个外部 JSON 配置文件

无法让 FirestoreRecyclerAdapter 显示项目

使用 Kivy 的 Python 跨类函数调用