我有一个欢迎屏幕,它通向一个表格视图。当用户点击一行时,他们会通过推送转到详细视图。这加载很快。另一个表视图也可能有另一个 push segue,但加载速度很慢。我认为这是因为它包含一个搜索栏和必须加载的数据。有什么办法可以在程序加载时实例化这个表视图而不是等待转场?缓慢加载表视图的类称为BSGlossaryController
. 我在想一些类似的东西,myGlossaryController = [[BSGlossaryController alloc]init]
但不确定。
2 回答
如果你想让 BSGlossaryController 在启动时实例化,你应该删除它的 segue,在启动时实例化它,然后手动推送到它。但是,您不想使用 alloc init 来实例化它,这将创建一个与情节提要中的不同的。您想使用 UIStoryboard 方法 instantiateViewControllerWithIdentifier: 来实例化它(并确保在 IB 中给它一个标识符)。当需要推送它时,您需要将您的按钮(或您用来触发推送的任何东西)挂钩到使用 pushViewController:animated: 进行推送的方法。
如果您在启动时执行此操作(在应用程序委托中),那么您必须将新创建的 BSGlossaryController 分配给一个属性,并访问您要从中推送的任何控制器。如果您可以等到该控制器(您从中推送的控制器)出现在屏幕上后再实例化它,那么您可以在该控制器的 viewDidLoad 方法中创建它。
通常,您不想一次加载一大块数据。如果块足够大以显着减慢您的视图加载,那么您需要重新考虑您的方法是一个不错的选择。撇开内存问题不谈,一次加载大量数据会在加载时阻塞应用程序的 UI。这将使应用程序无响应,用户会想知道发生了什么。
您可以通过几种不同的方式处理加载大型数据集 - 按优先顺序显示:
- 使用
NSFetchedResultsController
加载您的数据。这将自动处理缓存和分块数据,从而保持响应性和性能。 - 将您的数据分解为更小的子集。屏幕一次只能显示这么多数据,因此将数据加载到当前未显示的内存中是没有意义的。根据视图需要引入新数据。
- 首先呈现视图(没有数据),显示一个带有消息的活动指示器,通知用户正在加载数据,然后在后台线程上异步引入数据。这种方法至少不会让用户想知道发生了什么。
一旦您发布了一些代码,并且我对您正在尝试做什么以及原因有了更好的了解,我可以给出更具体的答案。