iPad应用程序 - 如何使用手指滑动杀死服务器呼叫



我们正在构建一个图像目录iPad应用程序。我们使用 2 种类型的图像:低分辨率缩略图(250 * 500 像素)和高分辨率完整图像(2048X2048 像素)。高分辨率图像大小为200kb至10mb。我们为高分辨率图像的下载实现了延迟加载和多线程。

由于它是一个图像目录应用程序,因此总图像可以在 200 到 500 个图像之间。此应用程序具有离线支持,因此我们将图像存储在应用程序文档目录中,以便稍后显示所有下载的图像。有按字母顺序对图像进行排序的功能,因此我们必须通过UIScrollView同时在屏幕上显示所有低分辨率图像。

当调用新的高分辨率图像时,每次首次打开图像时,图像通常需要 3-8 秒。这几乎冻结了应用程序,用户必须等待 3-8 秒才能执行其他任何操作。

我的开发人员几乎说过,没有简单的方法允许用户停止当前操作并移动到下一个图像,直到将完整的当前图像下载到内存中。

专家们,您认为我们应该能够以这样一种方式实现代码,即在下载高分辨率图像时,任何用户操作都将取代当前的高分辨率图像下载。 例如,手指滑动将启用标题栏(包含后退按钮,设置按钮)并将用户带到下一个图像?

感谢您的及时回复。但正如我们在问题中提到的,我们使用了延迟加载/多线程,这意味着我们使用了 NSURLConnection 异步请求。我们不使用主线程进行下载,甚至不使用文本数据。

我们创建了一个包含 NSURL 和委托的图像下载器类。我们编写了自定义协议,以便在每个图像的请求成功/失败后向相应的控制器发送通知。

@protocol TImageDownloaderDelegate
-(void)imageDownloadedSuccessfully:(ImageDownloader *)inDownloader;
-(void)prImageDownloadedSuccessfully :(ImageDownloader *)inDownloader;
@end

问题是,我们使用UIScrollView在同一屏幕中有多个(超过160个)图像,对于每个图像,我们都有高分辨率图像(大小在200KB到10 MB之间),我们正在下载高分辨率图像,下载每个图像后,我们正在刷新视图。因此,有时在一次又一次地渲染视图时滚动不是很流畅。因此,我们正在寻找某种方法来提高应用程序的性能。

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

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

编辑:通过AmitS提供的其他信息,我还要说的是,要处理您对相关视图的懒惰重新渲染。您可以考虑批量下载,仅在下载用户可见区域中的所有图像时才重新渲染,或者不在一个屏幕上渲染 160+ 高分辨率图像 - 在该大小下,缩略图可能就足够了,您可以推迟渲染高分辨率图像,直到用户放大它或选择它来填充屏幕。仔细考虑您是否真的需要在同一视图上渲染 160 张高分辨率图像;渲染如此多的图像时对性能的影响可能会抵消用户首先获得高分辨率图像的任何好处。

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

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

最新更新