ios - Swift:我应该为 Firebase 管理器类使用静态成员吗​​?好的程序设计

标签 ios swift firebase object

我正在制作一个需要大量功能的 Firebase 项目,包括身份验证、数据库和存储。我认为在每个 View Controller 中引用数据库太费力了,所以我正在制作一个 Firebase 管理器类来处理上传/下载/身份验证过程。

import Foundation
import Firebase

class FirebaseManager {
    var uid: String?
    var databaseRootRef: DatabaseReference?
    var storageRootRef: StorageReference?
    var authentication: Auth?

    init() {

    }

    func initialize() {
        uid = Auth.auth().currentUser?.uid
        databaseRootRef = Database.database().reference()
        storageRootRef = Storage.storage().reference()
        authentication = Auth.auth()
    }

    func isAuthenticated() -> Bool {
        return authentication?.currentUser != nil
    }

    func registerUserWith(name: String, email: String, password: String, completionHandler: (@escaping (User?, Error?) -> Void)) {
    authentication?.signIn(withEmail: email, password: password, completion: { (user, error) in
            completionHandler(user, error)
        })
    }
}

我有两个问题:

  1. 我什至不确定这是否是好的编程习惯。我没有看到很多在线教程这样做。但是,我个人认为这很好,因为 (a) 创建我的类是为了让它们有一个独特的目的。我的 View Controller 不需要担心 firebase 的工作 (b) 它使我的很多代码可重用并节省了很多行 (c) 我只是认为它允许我更容易地编辑任何与 firebase 相关的方法,因为现在我只需要编辑一个地方而不是 20 个地方

  2. 假设这是良好的编程习惯。我应该如何实现这个类?我现在正在做的是在每个 View Controller 文件中创建一个实例并在每个文件中初始化它们。或者,我可以 (a) 使类的所有成员和方法成为静态的,这样我就可以直接访问它们而无需初始化对象 (b) 不在每个 View Controller 中初始化对象,而是通过 segue 传输传递一个对象。哪种设计方法比较好

附言我有单独的初始化方法的原因是,如果我在 viewDidLoad 之前或定义对象时初始化对象,程序会崩溃,因为尚未创建 Firebase 引用。

非常感谢!

最佳答案

我建议不要使用静态/单例模式。

您可以改用子类化。

我的意思是,例如,您可以创建 FirebaseViewController,它处理与 FirebaseManager 的基本交互。 使用单例的问题是您无法清楚地了解数据何时发生变化。

顺便说一句,改用计算属性。这是 Swift 风格:

var isAuthenticated: Bool {
        return authentication?.currentUser != nil
}

关于ios - Swift:我应该为 Firebase 管理器类使用静态成员吗​​?好的程序设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49921162/

相关文章:

ios - 如果在 .h 文件中声明,则需要分配和初始化对象

如果鼠标移动太快,SwiftUI onHover 不会注册鼠标离开元素

javascript - 如何在firebase中存储每个用户的对象列表

firebase - 为什么这些 Firestore 规则不适用于 Flutter Firebase 插件?

ios - 标签边框未出现(iOS)

ios - UIButton 根据标题调整 View 高度 (Swift)

ios - 如何在 applicationWillTerminate 方法中调用 Web 服务并停止 VPN 服务器?

swift - SpriteKit 通过物理移动节点而不是更新位置

ios - 将 Swift 添加到 Objective-C 项目编译错误

javascript - 如何在 snapshot.foreach 中访问超出其范围的变量值