为当前用户Firebase创建静态变量?

时间:2017-11-29 18:29:00

标签: ios swift firebase

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

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

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

有什么理由不这样做吗?人们似乎建议不要使用静态变量,但在这种情况下,它似乎比每次我使用当前用户时传递更清晰的解决方案。

赞赏任何输入

3 个答案:

答案 0 :(得分:1)

最佳做法是谨慎使用单身,因为它们在您的数据流中是不规则的。

也就是说,currentUser课程的User似乎符合此标准完全

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

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

class YourUser {

    var email: String?
    let id: String

    static var currentUser: YourUser?

}

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

    /// 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 { }

答案 1 :(得分:0)

当您使用Auth.auth().currentUser检查当前用户时,您不会抓取任何内容。它将返回当前用户,如果他们未登录则为零。有关详细信息,请参阅docs

答案 2 :(得分:0)

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

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

现在,如果这两个原因并不引人注目并且您想要使用静态变量,我强烈建议您传递一些轻量级结构,其中包含用户信息 - 就像他们提到的那样。而不仅仅是Firebase Auth用户。每次进入新控制器时,您都无需执行此提取。