我有一个方法从数据库中读取一些数据并将其返回到闭包中,例如:
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中预加载它,如果它仍然没有在我导航时设置,请等到它显示用户数据之前?
答案 0 :(得分:0)
如果要在屏幕打开时启动数据加载,可以按以下方式继续:
openScreenOnDataLoad = true
)并显示进度指示器。如果您在某个其他地方/类中启动数据加载,您可以使用通知通知程序的其他部分数据已加载。
答案 1 :(得分:0)
我对这类案件的一般建议:
当移动到新的ViewController时,在初始化/ segue时应注入任何所需的依赖项,并且在ViewController的生命周期中其他所有内容应在内部处理
这使得显示ViewController的要求变得清晰,最小化了状态复杂性,并增加了模块性。
在您的情况下,这意味着HomeVC需要加载日期(最好指示在UI中的某处加载)并在创建时将其发送到UserVC,或者UserVC需要加载数据并处理任何加载UI 。
我个人更希望第二个选项最小化依赖关系,简化从其他任何地方的导航。
顺便说一句,如果您确定要使用像这样的单例,那么在模型中处理单例管理(创建,销毁)通常是一个好主意,并且(最多)只有访问<来自ViewControllers的/ em>它