ios - iPad 应用程序 - 如何使用手指滑动终止服务器调用

标签 ios multithreading ipad uiscrollview lazy-loading

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

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

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

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

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

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

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

@protocol TImageDownloaderDelegate

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

@end

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

最佳答案

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

此外,您的应用程序不应该在您下载图像时卡住。您需要让您的开发人员将这些下载放在后台线程中,这样它们就不会干扰您的用户界面的正常运行。如果您的应用程序由于网络连接时间过长而没有响应,它甚至可能被操作系统终止。有许多关于在 iOS 上对 NSURLConnection 实例进行后台处理或线程处理的在线指南——我强烈建议您遵循其中的一个。

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

关于ios - iPad 应用程序 - 如何使用手指滑动终止服务器调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11386966/

相关文章:

ios - 使用AVQueuePlayer时无声音

ios - 在特定时间自动打开 iOS 应用程序

ios - MKMapView 中的叠加 MKPolyLine 问题(rendererForOverLay)

iOS 11 上缺少 iOS 应用程序图标

multithreading - 我可以像互斥锁一样使用threads::shared模块中的锁吗?

python - 如何从另一个线程上调用的回调返回主线程

iphone - 关于运送 iphone 应用程序的安全问题

iphone - iOS 模拟器是否使用多核?

java - 如何使用 Java 多线程读取多个文件?

objective-c - UITableView 部分页脚在滚动时重叠