2013-11-23 2 views
3

У меня есть ниже код, называемый в:UICollectionView не перегрузочные ImageView клетки

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 

К сожалению, когда я звоню [collectionView reloadItemsAtIndexPaths:@[indexPath]]; ImageView внутри не обновляется. Если я вызываю reloadData, это так. Я стараюсь, чтобы код был максимально эффективным, поэтому я не хочу просто переписывать reloadData. Будет ли у кого-нибудь представление о том, почему это не работает или что еще мне нужно делать? У меня уже было несколько других проблем с загрузкой многочисленных запросов API-изображений, которые конфликтуют с прекрасным материалом endAnimations от collectionView. Любая помощь будет оценена по достоинству.

SearchResultsCollectionViewCell *searchResultCell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([SearchResultsCollectionViewCell class]) forIndexPath:indexPath]; 
    Product *product = self.products[indexPath.row]; 

    UIImage *productImage = [self.imageCache imageForURL:product.fullImageUrl]; 


    if (productImage) { 
     searchResultCell.productImageView.image = productImage; 
    } else { 
     [self.imageCache downloadImageForURL:product.fullImageUrl indexPath:indexPath withCompletion:^(UIImage *image, NSError *error) { 
      if (!error) { 
       searchResultCell.productImageView.image = image; 
//    [collectionView reloadData]; 
       [collectionView reloadItemsAtIndexPaths:@[indexPath]]; 
      } 

     }]; 
     UIImage* image = [UIImage imageNamed:@"001_logo"]; 
     searchResultCell.productImageView.image = image; 
    } 
+0

Первое, что нужно отметить (но я не думаю, что это причина) заключается в том, что вы меняете код 'indexPath.row' на' indexPath.item'. – Fogmeister

ответ

0

Способ доступа и хранения изображений кажется странным.

Как я могу это сделать, это создать @property для UIImage на productImage.

Тогда вы можете запросить продукт для его изображения. Если продукт возвращает нулевое изображение, поместите в ячейку местозаполнитель.

После завершения загрузки вы можете перезагрузить ячейки.

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

Блок завершения должен обновить модель (I.e. Сохранить изображение в объекте продукта), а затем перезагрузить ячейку.

Причина этого в том, что вы точно не знаете, что ячейка, на которой выполняется блок завершения, является (a) той же самой ячейкой, что и вы, или она (b) все еще отображает такой же товар.

+0

Должно быть, но это не так, я лично не разработал способ кэширования изображений (это странность, которую вы видите). Это странно, потому что я могу подтвердить, что правильное изображение загружается и возвращается ... но когда вызывается reloadItemsAtIndexPaths, кажется, что он стоит в очереди. Если я сделаю этот метод таким образом, то в конце концов появится сообщение о том, что я ударил предел анимации для UIView, который составляет около 31/32. Я бы предположил, что это одна и та же ячейка по ссылке указателя пути. Если я запустил это завершениеBlock как метод делегата, то ... он отлично работает. – TheCodingArt

+0

Удалили ли вы вызов для установки изображения в блоке завершения? Блок завершения должен запускать перезагрузку ... Кроме того, убедитесь, что он находится в основном потоке. Установите точку останова и посмотрите номер потока. Это должно быть 1. Если это не так, вам нужно нажать на основной поток. – Fogmeister

+0

Я уже пробовал обернуть все в 'dispatch_async (dispatch_get_main_queue(),^{', чтобы убедиться, что без везения. Причина, по которой он не должен запускаться, перезагружается и запускает reloadItemsAtIndexPaths, потому что он обновляет отдельные ячейки на индивидуальной основе, когда их изображения завершаются загрузкой от сетевого вызова. Все на основной нити, хотя (я бы хотел, чтобы это было так просто). – TheCodingArt

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