Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
何时在Swift(iOS开发)中从firebase获取数据_Ios_Swift_Database_Firebase_Structure - Fatal编程技术网

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

何时在Swift(iOS开发)中从firebase获取数据,ios,swift,database,firebase,structure,Ios,Swift,Database,Firebase,Structure,我目前正在创建一个应用程序,它将信息存储在用户设备必须拥有的数据库中,以便应用程序的某些部分做出不同的响应 我的问题是,我应该什么时候从firebase调用这些数据 e、 g 在我的应用程序的一部分中,应用程序需要知道用户当前是否“连接”到另一个用户。目前,当用户按下需要知道这些信息的选项卡栏图标时,它会根据数据库检查这些信息,这需要几秒钟的时间。(在viewdidload()覆盖函数中选中) 我是否应该在第一个视图控制器显示之前从数据库中获取所有数据 是否有办法在所有视图控制器之间共享此信息?

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

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

e、 g

在我的应用程序的一部分中,应用程序需要知道用户当前是否“连接”到另一个用户。目前,当用户按下需要知道这些信息的选项卡栏图标时,它会根据数据库检查这些信息,这需要几秒钟的时间。(在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”更新列表

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


我不确定像这样抓取数据的标准方法是什么,以及什么时候应该以一种最小化数据使用和数据库访问频率的方式进行抓取。

我认为您的做法是正确的。虽然您可能认为需要全局存储所有数据,以便可以从所有视图控制器访问这些数据,但您不需要。可以通过分段在ViewController之间传递数据。如果您正在制作一个基于选项卡的应用程序,只需在
viewdiload()
中提取该ViewController所需的数据(就像您正在做的那样)

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

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

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

简短的回答是肯定的,将所有数据库数据加载到应用程序中是一种非常糟糕的做法,有一些创造性的方法可以解决。没有更多的信息,我无法给你更多的帮助。你能发布你如何检查用户连接的代码,以及数据库的结构吗?@keverly嗨,我已经添加了我的结构和当前运行的代码的图像。任何帮助都将不胜感激,我对firebase和swift非常陌生。请不要发布文本结构的图像。如果不重新键入,我们无法在答案中使用它们,而且它们是不可搜索的。请以文本形式发布,可从Firebase控制台->右侧三点->导出JSON获取。然后在你的问题中复制并粘贴一个片段。知道我的思路是正确的,这令人鼓舞。我认为创建一个你提到的用户类在我的情况下会非常有用,谢谢你的建议!不知道这是否是个好主意/坏做法。我已决定将基本用户数据存储在UserDefaults中。然后我可以根据需要读写。@Tizer1000我会小心的。如果数据库中的数据发生更改,您可能会遇到问题,但UserDefaults数据不反映这些更改。如果您对UserDefaults进行了更改,请确保将相同的更改写入Firebase。