想通过UICollectionView实现图库。我有一组数组中的图像网址,比如大约20-30个网址。使用SDWebImageManager下载图像并将其缓存并显示在集合视图上。
请参阅下面的代码:
for(int i=0;i<[imagePath count];i++) {
[manager downloadWithURL:[NSURL URLWithString:[imagePath objectAtIndex:i]] options:0 progress:^(NSUInteger receivedSize, long long expectedSize) {
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) {
if(image){
NSLog(@"SUCCESS");
NSString *localKey = [NSString stringWithFormat:@"Item-%d", i];
NSLog(@"%@",localKey);
[[SDImageCache sharedImageCache] storeImage:image forKey:localKey];
}
}];
}
它只是显示第一个图像,其中我的imagePath数组中的url链接索引为0,其余单元格保持空白。当试图打印它时只显示SUCCESS一次和Item-0。我想它不会再进一步了。它只下载一个图像(数组中的第一个url图像)。请帮我解决一下这个。很长一段时间我都在打破这个问题。不确定我是否正确。或者请通过存储在数组中的多个url建议我实现图库的其他替代方案。
答案 0 :(得分:0)
我不得不怀疑你cellForItemAtIndexPath
正在做什么。如果它试图直接从缓存中检索图像,您可能会精确地看到您描述的行为(上述代码以异步方式运行,因此在cellForItemAtIndexPath
尝试从中检索它们时尚未下载图像高速缓冲存储器)。
就个人而言,我建议您甚至不要提前尝试填充缓存。只需cellForItemAtIndexPath
使用UIImageView+WebCache
类别方法setImageWithURL
,然后完全删除问题中的for
循环。它将自动为您填充缓存,丢失图像的问题可能会消失。
如果您在检索图像时遇到麻烦,则应使用一种将NSError
对象传递回块的SDWebImage方法。例如:
[cell.imageView setImageWithURL:url completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
if (error)
NSLog(@"%s: setImageWithURL error: %@", __FUNCTION__, error);
}];
如果URL地址无效,您可能会看到404错误。
如果您决定使用for
循环,还有其他一些想法:
顺便说一句,只有在image
为非nil
时才会进行记录。您可能希望else
语句的if
语句失败(例如,error
对象可能会告诉您一些有趣的内容)。如果API提供error
对象,您应该利用它。
有点好奇的是,正在下载的图像并使用另一个密钥将其添加到缓存中;现在你在缓存中有两个图像副本,这是浪费空间。下载完图像后,它已经在缓存中,如果您尝试使用相同的URL再次检索图像,它将从缓存中提取图像。使用您自己的密钥在缓存中创建另一个条目毫无意义。
如果您不打算使用progress
块,则可以为该参数传递nil
。