延迟从文件加载UIImages而不阻塞主线程?

时间:2010-08-18 02:49:23

标签: ipad uikit uiimage lazy-loading

在不阻塞主线程的情况下,按需加载UIImages有什么好的方法?

背景信息:我在墙上有几千张图像可以滚动浏览。显然加载所有UIImages是不可行的,所以现在我只是懒得加载那些显示的,然后在不再需要时释放它们。问题是从文件加载UIImages会花费相当多的时间,只需足够长的时间就可以在滚动时造成卡顿。这些绝不是大图像(大约250x250,可能每个20-30kb),但它们仍会造成口吃。

2 个答案:

答案 0 :(得分:0)

我使用自定义UIImageView子类来实现与此类似的操作。它主要用于下载图像(例如在Twitter流中思考头像和图像),因此它使用NSURLConnection从URL下载图像。然后URLConnection在完成后调用委托方法,然后我用它来更新UIImageView。 我后来添加的额外内容是带有缓存图像的静态字典,因此每次都不必下载更常用的图像。这对于像之前提到的推特头像这样的东西非常有用。

我不确定您是否尝试从网络或本地加载图片,因此这可能不适合您的情况,但我希望这会有所帮助......

答案 1 :(得分:0)

你可以这么简单地做到这一点。首先在创建UIScrollView对象时创建队列。 创建后,您可以使用刚创建的队列从本地存储加载图像。

//get a dispatch queue
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);


//this will start the image loading in bg
dispatch_async(concurrentQueue, ^{        
    NSData *image = [[NSData alloc] initWithContentsOfURL:imageURL];

    //this will set the image when loading is finished
    dispatch_async(dispatch_get_main_queue(), ^{
        imageView.image = [UIImage imageWithData:image];
    });
});