2014-02-03 5 views
1

В моем методе cellForItemAtIndexPath у меня есть этот код:Ленивые образы загрузки в UICollectionView с SDWebImageManager

SDWebImageManager *manager = [SDWebImageManager sharedManager]; 
[manager downloadWithURL:[NSURL URLWithString:coverURL] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { 

} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) { 
    RRRBigItemCell *cell = (RRRBigItemCell *)[collectionView cellForItemAtIndexPath:indexPath]; 
    if (cell) { 
     RRRImageView *coverView = (RRRImageView *)[cell viewWithTag:COVER_TAG]; 
     coverView.image = image; 
    } 
}]; 

Когда я запустить приложение и я прокрутки вниз, то все в порядке. Но когда я прокручиваю вверх, чем ячейки, которые уже были показаны, не загружены изображения (cell == nil). И если я снова прокручу вниз, проблема останется для уже отображаемых ячеек, но только новые загрузили изображения. Любая идея, что я делаю неправильно?

ответ

1

@pawan является правильным, это было бы простым способом осуществить SDWebImage. Это в основном категория UIImage, поэтому просто используйте методы категорий (setImageWithURL).

Несколько других точек с тех пор, как вы спросили;

  1. В вашем коде вы должны установить обложку coverImage.image в основной нити, а не в фоновом режиме.

  2. Рекомендуется проверять, является ли сотовая ячейка видимой или нет смысла отображать содержимое.

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

так что ваш код) может быть записана следующим образом, если вы настаивали на том, это способ у вас есть (использование категории - самый лучший и самый простой способ)

__weak myCollectionViewController *weakSelf = self; 
    SDWebImageManager *manager = [SDWebImageManager sharedManager]; 
    [manager downloadWithURL:[NSURL URLWithString:coverURL] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { 

    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) { 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     if ([weakSelf.collectionView.indexPathsForVisibleItems containsObject:indexPath]) { 
      RRRBigItemCell *cell = (RRRBigItemCell *)[weakSelf.collectionView cellForItemAtIndexPath:indexPath]; 
      RRRImageView *coverView = (RRRImageView *)[cell viewWithTag:COVER_TAG]; 
      coverView.image = image; 
     }; 
    }); 

}]; 
+0

Ну, я использовал решение pawan еще до того, как он написал свой ответ. Проблема заключалась в том, что RRRImageView это не просто подкласс UIImageView, поэтому было немного сложнее использовать эту категорию, но каким-то образом мне удалось это сделать. Я также попробовал ваше решение, но indexPathsForVisibleItems не содержал indexPath. Может, это потому, что я не использовал для этого основной поток? Есть идеи? Код был точно таким же, но без отправки ... – krzysiek

+0

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

1

почему бы вам не попробовать этот [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

ссылка SDWebImage

Смежные вопросы