在 UIscrollview 上延迟加载照片

Posted

技术标签:

【中文标题】在 UIscrollview 上延迟加载照片【英文标题】:Lazy loading of photos on a UIscrollview 【发布时间】:2011-12-11 02:03:35 【问题描述】:

我正在编写一个类似于 iPhone 上“官方”的照片库。它从 ALAsset 加载 3 个 UIImageViews(中间的一个,左右两边的上一个和下一个),加载缩略图,然后是 fullScreenImage,替换它的缩略图。

一切都发生在后台,dispatch_async 在串行队列中。

我的问题是当用户快速滚动照片时:应用程序尝试加载缩略图,而它仍在加载前一张照片的 fullScreenImage 版本,所以应该返回缩略图的 UIimageviews 的函数。 . 不返回,并出现延迟。

我无法取消已经在 dispatch_async 上运行的任务,以便为加载缩略图的函数提供最大优先级,那么我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

这是内置并发队列的 4 个(最初是 3 个)不同优先级旨在解决的一种情况。具体来说,假设你这样做:

dispatch_queue_t high, myImageQueue, myThumbnailQueue;

high = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0L);
myImageQueue = dispatch_queue_create("task.imageQ", NULL);
myThumbnailQueue = dispatch_queue_create("task.thumbQ", NULL);
dispatch_set_target_queue(myThumbnailQueue, high);

现在,您 dispatch_async() 到 myImageQueue 的任何工作的优先级都低于您提交到 myThumbnailQueue 的任何工作,因为该工作的目标队列已重新定位到高优先级并发队列。默认情况下,新串行队列的目标队列是“普通”优先级全局并发队列,因此我们不必在创建 myImageQueue 后对其进行任何操作。

【讨论】:

嗨,jkh,非常感谢您的回答。我已经尝试过不同的优先级,但没有成功。即使我为加载完整照片分配了低优先级,当一个新的缩略图请求(高优先级)排队时,如果前一个请求已经启动,它似乎不会被阻止。可能是因为从 ALAsset 加载涉及的强大磁盘活动...?似乎优先级可以用于密集的 CPU 任务,但从内存中加载并没有通过优先级来帮助... 一旦一个块已经在执行,就没有办法抢占它,所以你不会看到高优先级队列工作中断正在进行的低优先级工作的场景——队列的优先级只决定接下来执行哪个待处理的“工作”。在我看来,您需要更多地中断图像渲染工作,或者设置一个内部标志,这会导致图像渲染在缩略图渲染正在进行时“退出”,例如通过睡几百毫秒或什么的。效率不高,但没有重构所有代码,这可能会奏效!

以上是关于在 UIscrollview 上延迟加载照片的主要内容,如果未能解决你的问题,请参考以下文章

在 UIScrollView 中延迟加载不同尺寸的图像而不分页

使用 SQLite 中的数据在 UIScrollView 中延迟加载

如何在启用分页的 UIScrollView 中延迟加载 100 多个页面?

jQuery 无限滚动/延迟加载

使用drawRect延迟加载UIView:绘图

我正在将照片保存在 android 图库上,但照片保存有延迟