iPad应用程序 - 如何使用手指轻扫来杀死服务器

时间:2012-07-08 21:44:03

标签: ios multithreading ipad uiscrollview lazy-loading

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

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

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

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

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

感谢您的快速回复。但正如我们在问题中提到的,我们使用了Lazy loading / Multithreading,这意味着我们已经使用了NSURLConnection异步请求。即使不是文本数据,我们也没有使用主线程进行下载。

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

@protocol TImageDownloaderDelegate

-(void)imageDownloadedSuccessfully:(ImageDownloader *)inDownloader;
-(void)prImageDownloadedSuccessfully :(ImageDownloader *)inDownloader;

@end

问题是,我们使用UIScrollView在同一个屏幕上有多个(超过160个)图像,并且对于每个图像我们都有高分辨率图像(大小在200KB到10 MB之间),我们正在下载高分辨率图像并且在下载后我们每个图像都令人耳目一新。因此,有时一次又一次地渲染视图时滚动不是很平滑。所以我们正在寻找一些方法来改善应用程序的性能。

2 个答案:

答案 0 :(得分:2)

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

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

编辑:通过AmitS提供的其他信息,我还会说您将对您的视图进行懒惰的重新渲染。您可以考虑批量下载并仅在下载用户可见区域中的所有图像时重新渲染,或者不在一个屏幕上渲染160多个高分辨率图像 - 在该尺寸下,缩略图可能就足够了,您可以推迟渲染-res图像,直到用户放大或选择它来填充屏幕。仔细考虑是否确实需要在同一视图上渲染的160个高分辨率图像;您在渲染中所获得的性能影响如此之多的图像可能会使用户在首先获得高分辨率图像时无法获益。

答案 1 :(得分:1)

原则上可以,虽然app可能不会立即响应取消手势或点击。您可以使用NSOperation,并按照here所述取消长时间运行的操作(搜索“响应取消命令”)。

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