使用后台队列从 url 加载图像仍然不够快

Posted

技术标签:

【中文标题】使用后台队列从 url 加载图像仍然不够快【英文标题】:Image loading from url still not fast enough using a background queue 【发布时间】:2016-10-08 18:06:39 【问题描述】:

我启动了一个后台队列先加载图片,然后在主队列中更新UIImageView的图片。

        int i = 0;
        for (UIImageView *imageView in self.featuredPhotoImageViewCollection) 
            dispatch_async(dispatch_queue_create("imageQueue", NULL), ^
                NSURL *url = [NSURL URLWithString:[featuredPhotos[i] valueForKey:@"url"]];
                UIImage *image = [UIImage animatedImageWithAnimatedGIFURL:url];
                dispatch_async(dispatch_get_main_queue(), ^
                    imageView.image = image;
                );
            );
            i++;
        

但是,它仍然不够快。有 0.5 - 1 秒的延迟。除了使用后台队列还有什么其他建议吗?

【问题讨论】:

【参考方案1】:

你对后台队列的使用有误解。在您的代码中,ios 将开始执行您的后台代码,同时让主队列不做任何事情,直到完成后台代码,然后在主队列中更新您的图像视图。

因此,无论你在后台使用什么队列,这些都不会加快你的速度。

正常使用是 1)显示加载指示器, 2)后台队列做某事 3) 主队列 隐藏加载指示器 & 更新 UI

在您的情况下,我的建议是将您的 GIF 图像的快照显示为上述指标。或者您可以简单地显示指标。

或者在其他地方预加载所有 GIF 图像并在此处显示。加载多个图像总是需要一些时间。

【讨论】:

【参考方案2】:

您可以使用第三方库(如 SDWebImage)来使用缓存,这样它可以将您的问题减少到仅第一次下载。它还有一些您可能会觉得有用的优先级选项。

或者您可以在到达显示图像的视图之前下载图像。

【讨论】:

【参考方案3】:

如果gif是大文件,并且服务器支持多线程下载,那么你可以尝试使用dispatch_group来下载gif。

【讨论】:

以上是关于使用后台队列从 url 加载图像仍然不够快的主要内容,如果未能解决你的问题,请参考以下文章

在后台从 URL 加载 tableview 图像会导致重复

bLazy 和 Vue.js - DOM 准备得不够快

Android - 在显示进度时将图像从 URL 加载到 ImageView(不保存图像)

从网址加载图片呈现质量非常差

提高网站页面加载速度的方法

如何从 JSON 文件加载 React-Table 中的图像