【问题标题】:Creating static variable for current user Firebase?为当前用户 Firebase 创建静态变量?
【发布时间】:2017-11-29 18:29:00
【问题描述】:

通过应用程序身份验证后,我有多个视图控制器,我需要在其中显示当前用户的个人资料图片、简历和其他一些信息。

我要避免的问题是,每次用户进入他们的设置页面时,我都不想去获取他们的简历/其他信息。

与其在每个视图控制器上发送获取该信息的请求,不如在我进行身份验证时在我的用户类上创建一个“currentUser”的静态实例,获取用户的信息,这似乎是一个更好的主意,设置信息,然后进入应用程序并在我的应用程序中使用该变量进行呼叫和设置标签。

有什么理由不这样做吗?人们似乎建议不要使用静态变量,但在这种情况下,它似乎比每次我 segue 时都绕过我的 currentUser 更干净。

感谢任何意见

【问题讨论】:

    标签: ios swift firebase


    【解决方案1】:

    最好谨慎使用单例,因为它们在您的数据流中是不规则的。

    也就是说,User 类的 currentUser 似乎符合这个标准完全

    如果您的数据设置正确,则使用单例(测试等)的常见问题很容易处理,即使您在单个 UIViewControllers 中的测试逻辑,(即使我认为任何可测试的东西都不应该是在 VC 中!)。为此,您应该设置您的 User 类以进行依赖注入/模拟,这样您就可以轻松地进行测试。

    这是我对设置良好的 User 单例的想法,它有助于以后进行测试:

    class YourUser {
    
        var email: String?
        let id: String
    
        static var currentUser: YourUser?
    
    }
    

    我喜欢 initAuth,它只是将当前用户设置为身份验证数据,

        /// Inits with a Firebase user, and sets the current user to fir user
        ///
        /// - Parameter firUser: Firebase user
        init(withAuthUser authUser: AuthUser) {
    
            id = authUser.uid
            email = authUser.email
    
            YourUser.currentUser = self
    }
    

    AuthUser 只是我想要来自Auth 的数据的抽象(用于测试目的)。

    protocol AuthUser: class {
        var email: String? { get }
        var uid: String { get }
    }
    
    extension User: AuthUser { }
    

    【讨论】:

    • 这似乎是 OP 已经拥有的(或多或少)。他在询问是否每次都使用静态变量或传递引用。
    • 感谢您指出,我没有完全正确地阅读问题。我添加了更多信息以更好地调整我的答案。
    【解决方案2】:

    当您使用Auth.auth().currentUser 检查当前用户时,您不会获取任何内容。它将返回当前用户,如果他们没有登录,则返回 nil。有关更多信息,请参阅docs

    【讨论】:

      【解决方案3】:

      避免使用静态变量的主要原因之一是测试。如果你还没有编写测试,我强烈建议你养成这个习惯——你会惊讶于事情发生的频率是如此之低。但无论如何,假设您想测试视图控制器的逻辑。如果那个控制器有一堆对该静态变量的引用,那么它就会被卡住。在运行测试时,您可能可以在静态变量中的某些特殊情况下破解以返回不同的东西,但是如果您甚至可以让它工作的话,那将是一团糟。但是,如果您的视图控制器在 init 上使用一些 User 对象(或作为 var),您可以在其中传递当前用户,您可以通过传入一些带有假数据的虚拟用户来编写测试,并确保一切正常。

      这就是我不再使用静态变量的主要原因之一。另一种是同时访问。引用同一事物的对象越多,您尝试从一个地方访问某事物的机会就越大,因为它正在另一个地方发生变异。或者,您在几个不同的区域快速改变了某些东西,并且需要编写一些额外的代码来处理如果对象在其他地方发生了变异。

      现在,如果这两个原因不令人信服并且您想使用静态变量,我强烈建议您传递一些包含用户信息的轻量级结构 - 就像您提到的他们的生物一样。而不仅仅是 Firebase 身份验证用户。绝对没有理由每次进入新控制器时都需要执行此提取。

      【讨论】:

        猜你喜欢
        • 2019-10-04
        • 1970-01-01
        • 2017-04-30
        • 1970-01-01
        • 2020-10-25
        • 2011-11-20
        • 2020-06-17
        • 2015-12-20
        • 2017-04-30
        相关资源
        最近更新 更多