我实现了集合视图,我在其中显示文档目录中的图像。
但是由于图像从文档加载,集合视图不能平滑滚动。
如果图像从主束加载,那么它可以正常工作。
我的代码如下:
UIImageView *img=[[UIImageView alloc]init];
img.image=[UIImage imageWithContentsOfFile:[[arr_images objectAtIndex:indexPath.row]valueForKey:@"Image_path"]];
img.contentMode=UIViewContentModeScaleAspectFit;
cell.backgroundView=img;
我应该使用线程吗?如果是的话,我该怎么做? 我怎么解决这个问题?
答案 0 :(得分:6)
无需使用线程。偶尔加载图像很好,问题是你不断加载图像。
从主程序包加载可能正常,因为NSBundle正在为您缓存图像。您可以使用NSCache自行完成相同的工作。
所以不要这样:
img.image=[UIImage imageWithContentsOfFile:[[arr_images objectAtIndex:indexPath.row]valueForKey:@"Image_path"]];
做类似的事情:
static NSCache *cache = nil;
if (!cache) {
cache = [[NSCache alloc] init];
[cache setCountLimit:10]; // check how much RAM your app is using and tweak this as necessary. Too high uses too much RAM, too low will hurt scrolling performance.
}
NSString *path = [[arr_images objectAtIndex:indexPath.row]valueForKey:@"Image_path"];
if ([cache objectForKey:path]) {
img.image=[cache objectForKey:path];
} else {
img.image=[UIImage imageWithContentsOfFile:path];
[cache setObject:img.image forKey:path];
}
如果你最终发现需要使用线程,那么我会使用GCD线程来加载图像,但是然后将该图像插入到我在示例代码中创建的同一个NSCache对象中。基本上使用后台线程来尝试预测哪些图像需要预加载,但允许NSCache决定在销毁这些图像之前将这些图像保留多长时间。
答案 1 :(得分:0)
据推测,捆绑中的图像小于文档文件夹中的图像,否则没有区别。
是的,你应该使用线程。使用GCD是一个不错的选择,最重要的是不要直接使用单元格(你不知道它是否会在加载图像时重用),而是使用{{1在块内获取单元格,如果不是indexPath
,则更新图像。