在iOS上预加载资产

时间:2010-12-12 20:42:01

标签: iphone objective-c ios

假设你想要在UIImageView中使用一系列PNG实现几个动画。 如果我们在动画中有很多图像,那么从发送消息[myImgView startAnimation]开始,我们就会有延迟,因为内存中的所有图像都会加载。 我注意到加载是懒惰的:只要未发送startAnimation消息,图像就不会加载到内存中。 为了避免延迟问题,我将所有动画加载到app delegate中,作为子视图附加,然后动画一次。我想了解什么是最好的解决方案?如果我的实际解决方案有一个draback?

1 个答案:

答案 0 :(得分:1)

你对延迟加载是正确的。我从来没有能够确定它是否实际上是从磁盘或延迟解压缩的假脱机,但在任何一种情况下,UIImage(以及下面的CGImage)都不一定完全处理并准备好绘制直到它实际使用。我认为未来可能会再次出现,取决于Apple内部如何处理内存警告。

如果你真的非常热衷,我想最好的解决方案是使用CoreGraphics在后台加载和解压缩图像,只有在加载尚未完成时暂停才能在startAnimation上完成加载。你无法直接用UIKit对象实现它,因为它们不能在任何地方调用,而是在主线程上调用。您需要获取CGImage,绘制到位图上下文,然后从位图上下文创建一个图像,并将其发布到主线程上以包装到UIImage中。使用NSOperationQueue编制完整的操作列表可能很聪明。

假设您在加载所有PNG时不介意阻塞的额外启动成本,并且正确处理内存警告,那么您当前的方法应该没有任何问题我想不出更好解决方案,同时保持高水平的Objective-C内容。