我目前正在创建一个应用程序,该应用程序将信息存储在用户设备必须具有的数据库中,以便应用程序的某些部分做出不同的响应。
我的问题是,我什么时候应该从firebase调用这些数据。
e.g。
在我的应用程序的一部分中,应用程序需要知道用户当前是否“连接”到另一个用户。目前,当用户按下需要知道此信息的标签栏图标时,它会对数据库进行检查,这需要几秒钟。 (在viewdidload()覆盖func中检查)
在第一个视图控制器显示之前,我是否应该从数据库中获取所有数据?
有没有办法在所有视图控制器之间共享? 如果我可以将数据库中的所有数据加载到设备上的全局变量中,那么所有视图控制器都可以看到这看起来更容易,但是我不确定这是不是很好。
你会推荐什么?
基本上,现在,当用户打开应用程序并登录时,我需要存储每个用户的“名称”和“系列”,以便在所有类和视图控制器的全局应用程序中使用。
就列表而言。当用户点击列表所在的视图控制器时,目前我只是运行这样的代码
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'更新列表。
这意味着用户第一次点击进入购物视图时,列表填充前会有一些延迟。
我不确定采用这样的数据的标准方法是什么,以及什么时候应该以最小化数据使用和数据库访问频率的方式完成。
答案 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个项目列表时确实存在明显的延迟,则问题可能出在其他地方(网络,模拟器等)。