如何在iphone应用程序中加快segue到表视图的缓慢加载

如何在iphone应用程序中加快segue到表视图的缓慢加载,iphone,ios,xcode,Iphone,Ios,Xcode,我有一个欢迎屏幕,它会导致一个表视图。 当用户点击一行时,他们将通过推送序列进入详细视图。这个加载速度很快。 也有另一个推送序列可能到另一个表视图,但这是缓慢加载。 我认为这是因为它包含一个搜索栏和必须加载的数据。 有什么方法可以在程序加载时实例化这个表视图而不是等待segue?慢加载表视图的类称为BSGlossaryController。 我在想一些类似于myGlossaryController=[[BSGlossaryController alloc]init]的东西,但我不确定。如果你想让

我有一个欢迎屏幕,它会导致一个表视图。 当用户点击一行时,他们将通过推送序列进入详细视图。这个加载速度很快。 也有另一个推送序列可能到另一个表视图,但这是缓慢加载。 我认为这是因为它包含一个搜索栏和必须加载的数据。 有什么方法可以在程序加载时实例化这个表视图而不是等待segue?慢加载表视图的类称为
BSGlossaryController

我在想一些类似于myGlossaryController=[[BSGlossaryController alloc]init]的东西,但我不确定。

如果你想让BSGlossaryController在启动时实例化,你应该删除它的序列,在启动时实例化它,然后手动推送到它。但是,您不想使用alloc init来实例化它,这将创建一个与您的故事板中不同的实例。您希望使用UIStoryboard方法InstanceEviewController WithiIdentifier:来实例化它(并确保在IB中为它提供一个标识符)。当需要按下按钮时,您需要将按钮(或用于触发按下的任何按钮)挂接到使用pushViewController:animated:进行按下的方法


如果在启动时(在应用程序委托中)执行此操作,则必须将新创建的BSGlossaryController分配给属性,并访问要从中推送的控制器。如果您可以等待实例化它,直到该控制器(您正在推送的控制器)出现在屏幕上,那么您可以在该控制器的viewDidLoad方法中创建它。

通常,您不希望一次加载一大块数据。如果区块足够大,足以显著降低视图加载速度,那么很有可能您需要重新考虑您的方法。内存问题放在一边,一次加载大量数据会在加载时阻塞应用程序的UI。这会使应用程序无响应,用户会想知道发生了什么

您可以通过几种不同的方式处理加载大型数据集的问题——按首选项的顺序呈现:

  • 使用可加载数据的。这将自动处理缓存和分块数据,从而保持响应性和性能
  • 将数据分成更小的子集。屏幕一次只能显示这么多数据,因此将当前未显示的数据加载到内存中是毫无意义的。根据视图的需要引入新数据
  • 首先显示视图(无数据),显示活动指示器,并显示一条消息,通知用户正在加载数据,然后在后台线程上异步引入数据。这种方法至少不会让用户怀疑到底发生了什么

一旦您发布了一些代码,我对您尝试执行的操作以及原因有了更好的了解,我可以给出更具体的答案。

请向我们提供segue函数的代码,或者下一个视图的viewDidLoad或ViewWillDisplay或ViewDidDisplay方法的代码。这将是很容易诊断的问题莫克拉詹。我将离开电脑到星期三,到时候我也会离开。谢谢你。NSFetchedResultsController对我来说有点复杂,所以我很快就掌握了它,所以我清理了代码,这样就可以减少加载工作量。对此我深表歉意。我想了想,然后我想在启动时尝试实例化视图。这不是一个好方法。您不是在解决问题,而是将其推到另一个对象上。此外,在app委托中加入任何类型的重载都是一个非常非常糟糕的主意,尤其是在同步的情况下。如果Springboard(负责启动应用程序的守护进程)在一定时间内没有完成加载,它将终止你的应用程序。是的,经过反思,你一直都是对的。我最终采取的方法是简化代码,以便更快地加载,从而牺牲一些复杂性。这将花费我比学习NSFetchedResultsController更长的时间。谢谢你的建议,必要时我会再提。