【问题标题】:When to Grab Data From firebase in Swift (iOS dev)何时在 Swift 中从 firebase 获取数据(iOS 开发)
【发布时间】:2017-07-29 19:13:19
【问题描述】:

我目前正在创建一个应用程序,它将信息存储在用户设备必须具有的数据库中,以便应用程序的某些部分做出不同的响应。

我的问题是,我应该什么时候从 firebase 调用这些数据。

例如

在我的应用程序的一部分中,应用程序需要知道用户当前是否“连接”到另一位用户。目前,当用户按下需要知道此信息的选项卡栏图标时,它会根据数据库检查此信息,这需要几秒钟。 (在 viewdidload() 覆盖函数中检查)

我应该在第一个视图控制器显示之前从数据库中获取所有数据吗?

有没有办法在所有视图控制器之间共享这个? 如果我可以将数据库中的所有数据加载到设备上的所有视图控制器都可以看到的全局变量中,这似乎会容易得多,但是我不确定这是否是一种好习惯。

你会推荐什么?

我的数据库结构:

基本上,现在,当用户打开应用程序并登录时,我需要存储每个用户的“姓名”和“家庭”,以便在所有类和视图控制器的整个应用程序中全局使用。

就名单而言。当用户单击列表所在的视图控制器时,目前我只是在运行这样的代码

  self.ref.child("familys").child(email.replacingOccurrences(of: ".", with: "")).child("list").observe(.value, with: { (DataSnapshot) in

        if DataSnapshot.hasChildren() == false{
            print("No list")
            return
        }

        self.tableList = DataSnapshot.value as! [String]

        self.tableView.reloadData()


    }) { (Error) in
        print(Error)
    }

然后它继续并使用数组“tableList”更新列表。

这意味着用户第一次点击进入购物视图时,在列表填充之前会有一些延迟。

我不确定获取此类数据的标准方法是什么,以及何时应该以最小化数据使用和数据库访问频率的方式完成。

【问题讨论】:

  • 简短的回答是肯定的,将所有数据库数据加载到应用程序中是非常糟糕的做法,并且有一些创造性的方法可以解决它。如果没有更多信息,我无法为您提供更多帮助。您能否发布您如何检查用户连接以及数据库结构的代码?
  • @keverly 嗨,我已经添加了我的结构和我当前正在运行的代码的图像。任何帮助将不胜感激,我对 firebase 和 swift 非常陌生。
  • 请不要张贴文字结构的图片。我们不能在不重新输入的情况下在答案中使用它们,而且它们是不可搜索的。请将它们作为 TEXT 发布,可以从 Firebase 控制台获取 -> 右侧三点 -> 导出 JSON。然后将 sn-p 复制并粘贴到您的问题中。

标签: ios swift database firebase structure


【解决方案1】:

我认为你在正确的轨道上。尽管您可能认为您需要全局存储所有数据,以便可以从所有视图控制器访问它,但您不需要。您可以通过 segue 在 vi​​ewController 之间传递数据。如果您正在制作一个基于选项卡的应用程序,您只需在 viewDidLoad() 中提取该 ViewController 所需的数据(就像您正在做的那样)。

游戏的名称是构建您的 Firebase 数据库,这样当您提取数据时,您可以尽可能少地提取数据以填充视图控制器中的所有字段。由于 Firebase 使用 JSON 结构,因此为了加快搜索速度而将相同的数据保存两次并不可耻

话虽如此,我认为 currentUser 全局变量在您的情况下很有用。假设您有一个当前用户(一个用户登录),我将创建一个模仿 Firebase 的 User 类并实例化一个名为 currentUser 的全局变量。您的 currentUser 对象应该包含足够的信息来获取填充 ViewController 所需的任何内容。例如,如果你的 User 类有一个 email 属性,你可以这样做:

self.ref.child("familys").child(currentUser.email.replacingOccurrences(of: ".", with: "")).child("list").observe(.value, with: { (DataSnapshot) in

    if DataSnapshot.hasChildren() == false{
        print("No list")
        return
    }

    self.tableList = DataSnapshot.value as! [String]

    self.tableView.reloadData()


}) { (Error) in
    print(Error)
} 

应尽可能避免使用全局变量,但我认为只需将其减少为一个全局变量就足以让您继续前进。

至于您为什么会延迟,我不确定。当您提取少量数据时,它应该非常快。如果在提取 2 个项目的列表时确实存在明显的延迟,则问题可能出在其他地方(网络、模拟器等)。

【讨论】:

  • 很高兴知道我在正确的轨道上。我认为您提到的创建用户类在我的情况下非常有用,感谢您的建议!
  • 不知道这是个好主意/坏习惯。我决定将基本用户数据存储在 UserDefaults 中。然后我可以根据需要对其进行读写。
  • @Tizer1000 我会小心的。如果数据库中的数据发生更改,您可能会遇到问题,但 UserDefaults 数据不会反映这些更改。如果您对 UserDefaults 进行更改,请确保将相同的更改写入 Firebase。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多