iOS - SDWebImage加载错误图片

时间:2014-05-29 06:23:01

标签: ios uiimageview sdwebimage image-caching

我使用SDWebImage Library进行缓存和延迟加载。但我发现有时它会显示另一个细胞的图像。

详情Scenerio

  • CollectionView包含包含UIImageView和Labels的单元格。
  • ImageView包含用户图像和标签 名。

但有时Imageview中加载的图片会有不同的图像。

让我们说

Index  Name  Image
0      nameA  A
1      nameB  B
2      nameC  C
3      nameD  B

所以这里因为索引有nameD所以图像应该是b" D"但它显示的是nameB的图像,即" B"

这是我使用的代码

      if ([aMutDict objectForKey:@"picture_url"])
        {
            [[SDWebImageManager sharedManager]downloadWithURL:[NSURL URLWithString:[aMutDict objectForKey:@"picture_url"]] options:SDWebImageProgressiveDownload progress:Nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) {
                if(image){
                    [cell.imgProfilePic setImage:image];
                }else{
                    [cell.imgProfilePic setImage:ApplicationDelegate.gblImgPlaceholder];
                }
            }];

        }

2 个答案:

答案 0 :(得分:3)

您的方法存在的问题是,如果您滚动或完全下载图像,则单元格变量将保存任何其他单元格的地址,而不是您要显示图像的实际单元格。这就是图像显示为错误的原因。

将其更改为:

if ([aMutDict objectForKey:@"picture_url"])
{
    [cell.imgProfilePic setImageWithURL:[NSURL URLWithString:[aMutDict objectForKey:@"picture_url"]] 
                    placeholderImage:ApplicationDelegate.gblImgPlaceholder 
                    success:^(UIImage *image) {
                         NSLog("Image Loaded");
                     }
                     failure:^(NSError *error) {
                         NSLog("Image Not Loaded"); }
     ];
}

答案 1 :(得分:0)

在实施了Midhun的答案之后,我找到了另一个方法,根据 SDWebImage的新库。因为新的 UIImageView + WebCache.h

中没有成功/失败块

所以这适合我。

    if ([aMutDict objectForKey:@"picture_url"])
    {
        [cell.imgProfilePic setImageWithURL:[NSURL URLWithString:[aMutDict objectForKey:@"picture_url"]] placeholderImage:ApplicationDelegate.gblImgPlaceholder options:SDWebImageRefreshCached completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
            if(error){
                //Image Not Loaded
            }
            if(image)
            { 
                // Image Loaded
            }

        }];

    }