2009-05-06 78 views
0

在我的NiB中,我有几个View控制器。当应用程序启动时,所有对应的ViewDidLoad()调用都会被调用。优化presentModalViewController的加载时间:

在ViewControllerA中,我有ViewA,它包含一个带有100张图片的UiScrollView。在ViewdidLoad中初始化这些图片。因此,在应用程序发布时,所有图片都已初始化。

在我的主功能表视图控制器,我有一个按钮,按下时调用presentModalViewController:ViewControllerA

即呼叫正在20秒。

我认为在ViewDidload中的预加载会优化这一点。但是,一旦电话回复并被召回(第二次启动此VC,它非常快速且即时)。

那么是什么原因造成的呢?为什么第一次调用presentModalViewController需要这么长时间。在内部,它试图安排所有的图像?任何优化这个方法?如果没有,什么最好的方式来显示UiActivityIndi​​cator

预先感谢您

回答

0

首先,把你的-viewDidLoad方法的一些的NSLog()语句。当你认为他们的时候他们可能没有被召唤。 UIViewControllers是懒惰的。他们实际上并没有加载他们的NIB,直到有人引用他们的-view。

如果通过“调用所有对应的ViewDidLoad()调用,”你的意思是你实际上正在手动调用[viewController viewDidLoad],那将不起作用,不这样做。这是一个只能由系统调用的委托方法。

你可以但不应该通过调用[viewController view]来解决所有这些问题。这将迫使一个负载,但这几乎总是错误的答案。

图片有多大?你真的有可用的内存来保存所有100个时间吗?你可以在你需要的时候加载这些图片吗?图片展示了什么样的形状?一个UITableView可以为你做很多工作吗?如果他们在网格中,则可以为每个UITableViewCell显示4-5张图片,然后您将获得所有UITableView的优化。

+0

我有一个XIB所有VC和我与viewDidLoad中越来越在应用程序启动所谓的NSLog消息:(检查 我的应用是在景观和我想要的滚动horzontial上面有图片滚动型。 什么建议你会给这种实现 – user82383 2009-05-07 06:10:51

1

原来这太长了评论。

我会先玩弄UITableView,看它是否可以应用。

如果它是完全全屏的,那么你有UITableView纵向,但旋转你的单元格中的图片。这将与景观相同。

如果scrollview没有填充屏幕,您仍然可以尝试带视图变换的UITableView来旋转它。

然后,你的下一个方法应该是放置在滚动视图中懒惰地加载图像的占位符。如果所有图像的大小相同,那么这是非常简单的,您可以通过仅保留有限数量的这些单元来优化内存。

另一个疯狂的想法:使它成为一个UIWebView。这将为你做所有的懒惰负载。

+0

感谢罗布您的回应,我真的很感激它我试图优化我的方式我加载我的图像在我的滚动视图(加载一个接一个)。而不是我的initalization LoadView 。我有他们在ViewDidLoad:Animated。但是,我不能让他们逐一显示(所以用户看到的进步),他们只是都出现,你可以提出你的占位符的方法吗?我想实现这个 – user82383 2009-05-07 18:19:17

+0

你需要一个新的UIImageVi新的子类。它应该在提取真实图像时提供正确大小的占位符图像。如果您从磁盘中获取数据,那么您需要将实际图像提取放在后台线程上。如果您从网络中获取数据,则可以使用NSURLConnection将其加载到主线程上而不会阻塞。当UIImage完成加载时,您将调用setImage:来替换真实占位符。您可能必须在此时调用setNeedsDisplay:以使其重绘。 – 2009-05-08 15:01:18