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

时间:2016-10-08 18:06:39

标签: ios objective-c uiimageview uiimage dispatch-async

我首先启动后台队列来加载图像,然后在主队列中更新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秒。除了使用后台队列之外的任何其他建议吗?

3 个答案:

答案 0 :(得分:1)

你误解了后台队列的使用。在您的代码中,iOS将开始执行您的后台代码,同时让主队列完成任何操作,直到完成后台代码,然后更新主队列中的图像视图。

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

正常使用它是 1)显示加载指示, 2)后台队列{做点什么 3)主队列{hide loading indicator&更新UI}}

在您的情况下,我的建议是将GIF图像的快照显示为上面提到的指标。或者您只需显示指标即可。

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

答案 1 :(得分:0)

您可以使用像SDWebImage这样的第三方库来使用缓存,因此它可以将问题减少到第一次下载。它还具有您可能会发现有用的优先级选项。

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

答案 2 :(得分:0)

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