0

我们正在构建一个图像目录 iPad 应用程序。我们使用 2 种类型的图像:低分辨率缩略图(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 到 10 MB 之间),我们正在下载高分辨率图像,并且在下载每个图像之后我们令人耳目一新的景色。所以有时滚动在一次又一次地渲染视图时不是很流畅。所以我们正在寻找一些方法来提高应用程序的性能。

4

2 回答 2

2

绝对有办法做到这一点(实际上,可能有几种方法)。我的首选方法是使用NSURLConnection实例来管理较大图像的下载 - 您可以创建与图像的连接,然后在用户请求或需要移动到另一个图像时取消它。

更重要的是,当您下载图像时,您的应用程序不应冻结。您需要让您的开发人员将这些下载放在后台线程上,这样它们就不会干扰您的用户界面的正常性能。如果您的应用程序由于网络连接时间过长而没有响应,它甚至可能被操作系统终止。有许多在线指南用于在 iOS 上为 NSURLConnection 实例提供后台或一般线程 - 我强烈建议您遵循其中之一。

编辑:借助 AmitS 提供的其他信息,我还想说要处理您对相关视图的延迟重新渲染。您可能会考虑批量下载并仅在下载用户可见区域中的所有图像时重新渲染,或者不在一个屏幕上渲染 160+ 高分辨率图像 - 在那个尺寸下,缩略图可能就足够了,您可以推迟渲染高分辨率-res 图像,直到用户放大它或选择它以填满屏幕。仔细考虑你是否真的需要在同一个视图上渲染的 160 张高分辨率图像;您在渲染如此多的图像时所受到的性能影响可能会抵消用户从一开始就拥有高分辨率图像的任何好处。

于 2012-07-08T21:51:37.417 回答
1

原则上这是可能的,尽管应用程序可能不会立即响应取消手势或点击。您可以使用, 并按照此处NSOperation所述取消长时间运行的操作(搜索“响应取消命令”)。

此外,正如@Tim 在他的回答中所说,您的应用程序不应在加载大图像时冻结。如果发生这种情况,则意味着图像下载执行错误(它可能在主线程上执行,这是一个根本错误)。

于 2012-07-08T21:57:42.957 回答