何时从Swift(iOS开发)中的firebase获取数据

时间:2017-07-29 19:13:20

标签: ios swift database firebase structure

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

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

e.g。

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

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

有没有办法在所有视图控制器之间共享? 如果我可以将数据库中的所有数据加载到设备上的全局变量中,那么所有视图控制器都可以看到这看起来更容易,但是我不确定这是不是很好。

你会推荐什么?

我的数据库结构:database screenshot

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

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

  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'更新列表。

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

我不确定采用这样的数据的标准方法是什么,以及什么时候应该以最小化数据使用和数据库访问频率的方式完成。

1 个答案:

答案 0 :(得分:1)

我认为你走在正确的轨道上。虽然您可能认为您需要全局存储的所有数据,因此您可以从所有视图控制器访问它,但您不需要。您可以通过segues在viewControllers之间传递数据。如果您正在创建基于选项卡的应用程序,则只需在viewDidLoad()中提取该ViewController所需的数据(就像您正在做的那样)。

游戏的名称是构建您的Firebase数据库,以便在您提取数据时,您可以尽可能少地拉动视图控制器中的所有字段。由于Firebase使用JSON结构,因此在保存相同数据两次时没有任何羞耻感,以便更快地进行搜索

话虽如此,我认为currentUser全局变量在您的情况下很有用。假设您有一个当前用户(一个用户登录),我只想创建一个模仿Firebase的User类,并实例化一个名为currentUser的全局变量。您的currentUser对象应该包含足够的信息来提取和填充ViewControllers所需的任何内容。例如,如果您的User类具有电子邮件属性,则可以执行以下操作:

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个项目列表时确实存在明显的延迟,则问题可能出在其他地方(网络,模拟器等)。