带有NINetworkImageViews的UICollectionView重复图像

时间:2013-01-21 17:41:01

标签: ios uicollectionview nimbus-ios

我正在使用Nimbuskit的NINetworkImageView。我有一个简单的UICollectionView显示图像网格(NINetworkImageViews)。通常它就像一个魅力,但在某些情况下,一些NINetworkImageViews显示错误的图像。

我认为当没有图像路径且NINetworkImageView必须显示默认图像时会发生这种情况。有时(几次)而不是显示默认图像,它会出现属于CollectionView的其他NINetworkImageView的其他图像。

以下是相关代码:

- (UICollectionViewCell*) collectionView:(UICollectionView *)collectionView   cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"ShelvingCell";
    ShelvingCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];

    // Prueba para ver si esto arregla lo de que se repitan imágenes
    [cell.feedNetworkImageView prepareForReuse];

    cell.feedNetworkImageView.delegate = self;

    // El collage necesita un tratamiento especial
    if (indexPath.section == 0 && indexPath.row == 0)
    {
        cell.feedTitleLabel.text = @"";
        cell.lastFeedNewTitleLabel.text = @"";
        // Prueba para ver si esto arregla lo de que se repitan imágenes
        [cell.feedNetworkImageView setPathToNetworkImage:@""];

        // Prueba para ver si esto arregla lo de que se repitan imágenes
        [cell.feedNetworkImageView prepareForReuse];

        cell.feedNetworkImageView.image = [UIImage imageNamed:@"collage.png"];
    }
    else
    {    
        MOFeed *feed = [self.feeds objectAtIndex:(indexPath.section*3 + indexPath.row - 1)];
        cell.feedTitleLabel.text = feed.title;

        // Recuperamos la última noticia del feed
        MONoticia *ultimaNoticia = [feed lastFeedNew];

        cell.lastFeedNewTitleLabel.text = ultimaNoticia.title;

        if (![feed.feedImageURL isEqualToString:@""] && feed.feedImageURL)
        {
            // Prueba para ver si esto arregla lo de que se repitan imágenes
            [cell.feedNetworkImageView prepareForReuse];
            [cell.feedNetworkImageView setPathToNetworkImage:feed.feedImageURL];
        }
        else
        {
            // Prueba para ver si esto arregla lo de que se repitan imágenes
            [cell.feedNetworkImageView prepareForReuse];

            cell.feedNetworkImageView.image = [UIImage imageNamed:@"shelvingcell.png"];
            // Prueba para ver si esto arregla lo de que se repitan imágenes
            [cell.feedNetworkImageView setPathToNetworkImage:@""];
        }
    }
    return cell;
}

非常感谢!

卡洛斯

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,当我深入研究这个问题时,看起来像是

[cell.feedNetworkImageView prepareForReuse];

没有取消所有下载操作。你必须做一点黑客

致电前

[cell.feedNetworkImageView setPathToNetworkImage:feed.feedImageURL];

取消所有网络操作操作,然后创建新的网络操作

[self.displayImage.networkOperationQueue cancelAllOperations];
self.displayImage.networkOperationQueue = [[NSOperationQueue alloc]init];
[cell.feedNetworkImageView setPathToNetworkImage:feed.feedImageURL];
由于每个图像下载都需要它自己的操作队列,因此它可以被取消,因此效率不高。这可能需要更多的工作来提高效率。但到目前为止看起来没有重复的图像

答案 1 :(得分:0)

Carlos,我对NINetworkImageView了解不多,但我的理论是UICollectionView正在重用你的观点,你不会取消请求。假设您加载第一个单元格,然后为该图像触发请求。然后你开始滚动。第一个单元格在第一个请求完成之前被重用,并且可能这个新项目重用该单元格没有图像,因此您不要调用setPathNetwork ...结果,新的重用单元格将具有第一个单元格图像。

NINetworkImageView中可能有一个取消请求的方法。每次重复使用其中一个视图时都要调用它。

Un saludo!