在不阻塞主线程的情况下,按需加载UIImages有什么好的方法?
背景信息:我在墙上有几千张图像可以滚动浏览。显然加载所有UIImages是不可行的,所以现在我只是懒得加载那些显示的,然后在不再需要时释放它们。问题是从文件加载UIImages会花费相当多的时间,只需足够长的时间就可以在滚动时造成卡顿。这些绝不是大图像(大约250x250,可能每个20-30kb),但它们仍会造成口吃。
答案 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];
});
});