【问题标题】:UICollectionView with NINetworkImageViews repeats images带有 NINetworkImageViews 的 UICollectionView 重复图像
【发布时间】:2013-01-21 17:41:01
【问题描述】:

我正在使用 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;
}

非常感谢!

卡洛斯

【问题讨论】:

  • 谢谢桑!我已经创建了一个自定义单元格,并通过情节提要对其进行了初始化。而 setPathToNetworkImage 是一个自定义设置器......所以我不确定这是问题......
  • 您好,如果还没有解决,请发给我一个关于 NINetworkImageView 的简单示例(仅在 UIImageView 中显示)。我之前遇到过这个问题并解决了它,但使用 SDWebImage:mediafire.com/?96bhqh9j1njsl7l

标签: ios uicollectionview nimbus-ios


【解决方案1】:

我有同样的问题,当我深入研究这个问题时,它看起来像

[cell.feedNetworkImageView prepareForReuse];

没有取消所有下载操作。你必须做一些小技巧

通话前

[cell.feedNetworkImageView setPathToNetworkImage:feed.feedImageURL];

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

[self.displayImage.networkOperationQueue cancelAllOperations];
self.displayImage.networkOperationQueue = [[NSOperationQueue alloc]init];
[cell.feedNetworkImageView setPathToNetworkImage:feed.feedImageURL];

效率不高,因为每个图像下载都需要自己的操作队列,因此可以取消。这可能需要更多的工作才能提高效率。但到目前为止看起来没有重复的图像

【讨论】:

  • 谢谢查理!我会在几周内尝试您的解决方案
【解决方案2】:

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

可能在 NINetworkImageView 中有一个方法可以取消请求。每次重用这些视图之一时调用它。

谢谢!

【讨论】:

  • 感谢 LocoMike!我认为问题出在你所说的那样。但是,我正在调用 [cell.feedNetworkImageView prepareForReuse] 执行以下操作:“终止任何网络请求并用初始图像替换显示的图像。通过取消任何现有请求并再次显示初始图像来准备此视图以供重用”
  • 好吧,我不知道 NINetworkImageView 的内部结构,但是您可以在 setImage 中调试并设置断点,以查看已取消的请求是否正在尝试设置图像。抱歉,我帮不上忙,但是用于异步图像加载的库太多了,根本不想深入研究另一个 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 2013-08-19
  • 2017-12-13
相关资源
最近更新 更多