iOS:SDWebImage 加载带有错误图像的单元格

Mar*_*cus 1 iphone ios sdwebimage

我目前正在使用 SDWebImage 为我的表格单元格加载图片,使用以下代码:

[cell.coverImage sd_setImageWithURL:[self.dataInJSONModel.Content[indexPath.row] CoverImage] placeholderImage:[UIImage imageNamed:@"imageplaceholder_general"]];
Run Code Online (Sandbox Code Playgroud)

问题是当我上下滚动时,图像被插入了错误的单元格中。在阅读了有关此问题的 StackOverflow 上的一些帖子后,我怀疑这是由于滚动时重复使用了单元格,因此图像的异步下载可能放置在已更改的单元格 indexPath 上。

因此,我实施了几项更改,例如:

SDWebImageManager *manager = [SDWebImageManager sharedManager];
UIImageView * cellCoverImage = cell.coverImage;
[manager downloadImageWithURL:[self.dataInJSONModel.Content[indexPath.row] CoverImage] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL * oriURL) {

      NSArray *visibleIndexPaths = [tableView indexPathsForVisibleRows];
      if ([visibleIndexPaths containsObject:indexPath]) {

          cellCoverImage.image = image;
       }
   }]; 
Run Code Online (Sandbox Code Playgroud)

甚至可以比较 URL:

SDWebImageManager *manager = [SDWebImageManager sharedManager];
UIImageView * cellCoverImage = cell.coverImage;
[manager downloadImageWithURL:[self.dataInJSONModel.Content[indexPath.row] CoverImage] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL * oriURL) {

   if([oriURL isEqual:[self.dataInJSONModel.Content[indexPath.row] CoverImage]])
    {
        cell.coverImage.image = image;

    }

 }];
Run Code Online (Sandbox Code Playgroud)

问题仍然存在。或者我可能错误地编程了它?在网上找到了几个建议,但还没有看到具体的解决方案。

需要帮忙!

编辑

我已经对其进行了一些更改,但仍然无法正常工作:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

NewsFeedCell * cell = [tableView dequeueReusableCellWithIdentifier:@"NewsFeedCell" forIndexPath:indexPath];


if (self.dataInJSONModel)
{
   cell.coverImage.image = nil;
    SDWebImageManager *manager = [SDWebImageManager sharedManager];
    [manager downloadImageWithURL:[self.dataInJSONModel.Content[indexPath.row] CoverImage] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL * oriURL) {

        if ([cell isEqual:[self.tableView cellForRowAtIndexPath:indexPath]])
        {
            cell.coverImage.image = image;
        }

    }];

}
Run Code Online (Sandbox Code Playgroud)

小智 5

我遇到了同样的问题,并尝试分配 .image = nil,但不起作用。

最后,我的解决方案是使用取消操作覆盖 UITableViewCell 中的 prepareForReuse:

- (void)prepareForReuse  
{
    [super prepareForReuse];
    [_imageView sd_cancelCurrentImageLoad];
}
Run Code Online (Sandbox Code Playgroud)