如何在移动到另一个VC之前预加载数据

时间:2018-02-15 20:13:15

标签: swift closures

我有一个方法从数据库中读取一些数据并将其返回到闭包中,例如:

 DatabaseManager.readUser(withUserID: "Bob") { (user, error)
        MySingleton.shared.user = user
 }

我有一个家庭VC,它是我的登陆页面,还有一个用户可以导航到的“用户”VC。我的用户VC需要显示从数据库读取的数据,在本例中为MySingleton.shared.user

我的问题

我目前正在尝试在我家VC中的后台线程上加载用户的数据,因此当用户导航到用户VC时,可以显示数据。但是,如果用户导航到用户VC太快,在读取数据之前,我的应用程序崩溃,因为MySingleton.shared.user为零,正如预期的那样。

我的另一个选择是将viewDidLoad()中的数据加载到我的用户VC中,并在关闭中设置后显示它。但这可能会导致VC加载的时间和数据读取的时间之间存在一种空白屏幕。

无缝用户体验的最佳选择是什么?有没有办法我可以尝试在我的家庭VC中预加载它,如果它仍然没有在我导航时设置,请等到它显示用户数据之前?

2 个答案:

答案 0 :(得分:0)

如果要在屏幕打开时启动数据加载,可以按以下方式继续:

  1. 点击按钮,检查您的数据是否已加载。如果是 - 打开下一个屏幕,如果没有 - 设置一个标志(例如openScreenOnDataLoad = true)并显示进度指示器。
  2. 在数据加载完成后的闭包中检查该标志,如果设置了标志,则打开下一个屏幕。
  3. 如果您在某个其他地方/类中启动数据加载,您可以使用通知通知程序的其他部分数据已加载。

答案 1 :(得分:0)

我对这类案件的一般建议:

当移动到新的ViewController时,在初始化/ segue时应注入任何所需的依赖项,并且在ViewController的生命周期中其他所有内容应在内部处理

这使得显示ViewController的要求变得清晰,最小化了状态复杂性,并增加了模块性。

在您的情况下,这意味着HomeVC需要加载日期(最好指示在UI中的某处加载)并在创建时将其发送到UserVC,或者UserVC需要加载数据并处理任何加载UI 。

我个人更希望第二个选项最小化依赖关系,简化从其他任何地方的导航。

顺便说一句,如果您确定要使用像这样的单例,那么在模型中处理单例管理(创建,销毁)通常是一个好主意,并且(最多)只有访问<来自ViewControllers的/ em>它