我们正在构建一个图像目录iPad应用程序。我们使用两种类型的图像:低分辨率缩略图(250 * 500像素)和高分辨率全图(2048X2048像素)。高分辨率图像大小分别为200kb到10mb。我们已经实现了延迟加载和多线程来下载高分辨率图像。
因为它是一个图像目录应用程序,所以总图像可以在200到500个图像之间。这个应用程序有离线支持,所以我们将图像存储在应用程序文档目录中,以便稍后显示所有下载的图像。它具有按字母顺序排序图像的功能,因此我们必须通过UIScrollView在屏幕上同时显示所有低分辨率图像。
当调用新的高分辨率图像时,每次第一次打开图像时,图像通常需要3-8秒。这在很大程度上冻结了应用程序,用户必须等待3-8秒才能做其他事情。
我的开发人员说过,没有一种简单的方法可以让用户停止当前的操作并移动到下一个图像,直到完整的当前图像下载到内存中。
您是否认为我们应该能够以这样一种方式实现代码:当下载高分辨率图像时,任何用户操作都将超级放弃当前的高分辨率图像下载。例如,手指滑动将启用标题栏(包含后退按钮,设置按钮),并将用户带到下一个图像?
谢谢你们的及时回复。但正如我们在问题中提到的,我们使用了延迟加载/多线程,这意味着我们使用了NSURLConnection异步请求。我们不使用主线程进行下载,甚至不使用文本数据。
我们已经用NSURLConnection和委托创建了一个图像下载器类。我们已经编写了自定义协议,以便在每个镜像的请求成功/失败后向相应的控制器发送通知。
@protocol TImageDownloaderDelegate
-(void)imageDownloadedSuccessfully:(ImageDownloader *)inDownloader;
-(void)prImageDownloadedSuccessfully :(ImageDownloader *)inDownloader;
@end问题是,我们使用UIScrollView在同一屏幕上有多个(超过160个)图像,对于每个图像,我们都有高分辨率图像(大小在200KB到10MB之间),我们正在下载高分辨率图像,在下载每个图像之后,我们正在刷新视图。所以有时在反复渲染视图时,滚动不是很流畅。因此,我们正在寻找一些方法来提高应用程序的性能。
发布于 2012-07-09 05:51:37
绝对有一种方法可以做到这一点(实际上,可能有几种方法)。我的首选方式是使用NSURLConnection实例来管理较大图像的下载-您可以创建到某个图像的连接,然后如果用户请求它或如果您需要移动到另一个图像,则取消该连接。
更重要的是,当你下载图片时,你的应用程序不应该冻结。您需要让您的开发人员将这些下载放在后台线程上,这样它们就不会干扰您的用户界面的正常性能。如果您的应用程序由于长时间的网络连接而没有响应,那么它甚至可能会被操作系统终止。有许多关于在iOS上创建NSURLConnection实例或线程的在线指南--我强烈建议您遵循其中一个指南。
编辑:使用AmitS提供的其他信息,我想说的是,我还想让你懒惰地重新渲染有问题的视图。您可以考虑批量下载,仅当用户可见区域中的所有图像都已下载时才重新渲染,或者不在一个屏幕上渲染160+高分辨率图像-在这种大小下,缩略图可能就足够了,并且您可以推迟渲染高分辨率图像,直到用户放大它或选择它来填满屏幕。仔细想想你是否真的需要160个高分辨率的图像都渲染在同一个视图上;渲染这么多图像所带来的性能损失可能会抵消用户从一开始就拥有高分辨率图像的好处。
发布于 2012-07-09 05:57:43
这在原则上是可能的,尽管应用程序可能不会立即响应取消手势或点击。您可以使用NSOperation,并按照here所述取消长时间运行的操作(搜索"Responding to the cancel Command")。
此外,正如@Tim在他的回答中所说的那样,你的应用程序不应该在加载大图像时冻结。如果发生这种情况,这意味着图像下载是错误的(它可能是在主线程上实现的,这是一个根本性的错误)。
https://stackoverflow.com/questions/11386966
复制相似问题