UICollectionView с NINetworkImageViews повторяет изображения

Я использую NINetworkImageView от Nimbuskit. У меня есть простой UICollectionView, показывающий сетку изображений (NINetworkImageViews). Обычно это работает как шарм, но в определенных ситуациях некоторые из NINetworkImageViews показывают неправильное изображение.

Я думаю, это происходит, когда для изображения нет пути, и NINetworkImageView должен показывать изображение по умолчанию. Иногда (несколько раз) вместо отображения изображения по умолчанию появляется другое изображение, принадлежащее другому NINetworkImageView CollectionView.

Вот соответствующий код:

- (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;
}

Большое спасибо!

Карлос


person Carlos    schedule 21.01.2013    source источник
comment
См.: stackoverflow .com/questions/14204204/   -  person LE SANG    schedule 21.01.2013
comment
Спасибо Санг! Я уже создал пользовательскую ячейку, и она инициализируется через раскадровку. И setPathToNetworkImage - это настраиваемый сеттер... Так что я не уверен, что это проблема...   -  person Carlos    schedule 21.01.2013
comment
Привет, если все еще не удается решить, пришлите мне простой пример о NINetworkImageView (отображать только в UIImageView). Я сталкивался с этой проблемой раньше и решил ее, но с помощью SDWebImage: mediafire.com/?96bhqh9j1njsl7l   -  person LE SANG    schedule 22.01.2013


Ответы (2)


У меня была такая же проблема, и когда я вникаю в проблему, это выглядит так

[cell.feedNetworkImageView prepareForReuse];

не отменял всю операцию загрузки. вам нужно сделать небольшой хак

перед звонком

[cell.feedNetworkImageView setPathToNetworkImage:feed.feedImageURL];

отменить все сетевые операции, а затем создать новую сетевую операцию

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

это не так эффективно, поскольку для каждой загрузки изображения требуется собственная очередь операций, чтобы ее можно было отменить. это может потребовать немного больше работы, чтобы сделать его более эффективным. но пока похоже нет повторяющихся изображений

person Charlie Wu    schedule 30.03.2013
comment
Спасибо, Чарли! Я попробую ваше решение через пару недель - person Carlos; 05.04.2013

Карлос, я мало что знаю о NINetworkImageView, но моя теория состоит в том, что UICollectionView повторно использует ваши представления, и вы не отменяете запрос. Допустим, вы загружаете первую ячейку, а затем для этого изображения инициируется запрос. Затем вы начинаете прокручивать. Эта первая ячейка повторно используется до завершения первого запроса, и, возможно, этот новый элемент, повторно использующий эту ячейку, не имеет изображения, поэтому вы не вызываете setPathNetwork... В результате новая повторно используемая ячейка будет иметь первое изображение ячейки.

Вероятно, в NINetworkImageView есть способ отменить запрос. Вызывайте его каждый раз, когда повторно используете одно из этих представлений.

Un привет!

person LocoMike    schedule 22.01.2013
comment
Спасибо, ЛокоМайк! Я думаю, проблема в чем-то, как вы говорите. Но я вызываю [cell.feedNetworkImageView prepareForReuse], который делает следующее: отключает любые сетевые запросы и заменяет отображаемое изображение исходным изображением. Подготавливает это представление к повторному использованию, отменяя все существующие запросы и снова отображая исходное изображение. - person Carlos; 22.01.2013
comment
Ну, я не знаю внутренностей NINetworkImageView, но вы можете отладить и установить точку останова в setImage, чтобы увидеть, пытается ли отмененный запрос установить изображение. Извините, больше ничем не могу помочь, но библиотек для асинхронной загрузки изображений слишком много, и просто не хочется углубляться в другую :) - person LocoMike; 22.01.2013