无法使用iOS上的SDWebImageManager从远程服务器下载图像

时间:2013-07-03 12:14:14

标签: ios uicollectionview sdwebimage

想通过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建议我实现图库的其他替代方案。

1 个答案:

答案 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循环,还有其他一些想法:

  1. 顺便说一句,只有在image为非nil时才会进行记录。您可能希望else语句的if语句失败(例如,error对象可能会告诉您一些有趣的内容)。如果API提供error对象,您应该利用它。

  2. 有点好奇的是,正在下载的图像并使用另一个密钥将其添加到缓存中;现在你在缓存中有两个图像副本,这是浪费空间。下载完图像后,它已经在缓存中,如果您尝试使用相同的URL再次检索图像,它将从缓存中提取图像。使用您自己的密钥在缓存中创建另一个条目毫无意义。

  3. 如果您不打算使用progress块,则可以为该参数传递nil