Асинхронно загружать изображение в uitableviewcell

Я пытаюсь асинхронно загружать изображение в UITableVIew .

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = nil; NSString *cellIndetify = [NSString stringWithFormat:@"cell%d",tableView.tag -TABLEVIEWTAG]; cell = [tableView dequeueReusableCellWithIdentifier:cellIndetify]; IndexPath *_indextPath = [IndexPath initWithRow:indexPath.row withColumn:tableView.tag - TABLEVIEWTAG]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIndetify]; cell.selectionStyle = UITableViewCellSelectionStyleNone; cell.contentView.backgroundColor = [UIColor blackColor]; // here I init cell image view UIView *cellSub = [self.waterFlowViewDatasource waterFlowView:self cellForRowAtIndexPath:_indextPath]; cellSub.backgroundColor = [UIColor blackColor]; [cell.contentView addSubview:cellSub]; cellSub.tag = CELLSUBVIEWTAG; } // fill image info [self.waterFlowViewDatasource waterFlowView:self fillDataIntoCellSubview:[cell viewWithTag:CELLSUBVIEWTAG] withIndexPath:_indextPath]; CGFloat cellHeight = [self.waterFlowViewDelegate waterFlowView:self heightForRowAtIndexPath:_indextPath]; CGRect cellRect = CGRectMake(0, 0, _cellWidth, cellHeight); [[cell viewWithTag:CELLSUBVIEWTAG] setFrame:cellRect]; [self.waterFlowViewDatasource waterFlowView:self relayoutCellSubview:[cell viewWithTag:CELLSUBVIEWTAG] withIndexPath:_indextPath]; return cell; } 

в этом классе ImageView I init:

 (id)initWithIdentifier:(NSString *)indentifier { if(self = [super initWithIdentifier:indentifier]) { self.backgroundColor = [UIColor blackColor]; if (!self.imageView) { _imageView = [[UIImageView alloc] init]; self.imageView.backgroundColor = IMAGEVIEWBG; [self addSubview:self.imageView]; self.imageView.layer.borderWidth = 1; self.imageView.layer.borderColor = [[UIColor colorWithRed:0.85 green:0.85 blue:0.85 alpha:1.0] CGColor]; } ......some others controllers } -(void)setImageWithURL:(NSURL *)imageUrl{ UIImage *cachedImage = [[SDImageCache sharedImageCache] imageFromKey:[imageUrl absoluteString]]; if (cachedImage) { self.imageView.image = cachedImage; }else{ SDWebImageManager *manager = [SDWebImageManager sharedManager]; [manager downloadWithURL:imageUrl delegate:self options:SDWebImageCacheMemoryOnly userInfo:[[NSDictionary alloc] initWithObjectsAndKeys:[imageUrl absoluteString], @"image_url", [NSValue valueWithBytes:&imageSize objCType:@encode(CGSize)], @"image_size", [NSNumber numberWithInt:arrIndex], @"imageview_index", nil]]; _imageView.image = [UIImage imageNamed:@"album_detail_placeholder.png"]; } ..... ..... - (void)imageDecoder:(SDWebImageDecoder *)decoder didFinishDecodingImage:(UIImage *)image userInfo:(NSDictionary *)userInfo { imageView.image = image } 

Как вы видите здесь, я использовал SDWebImageManager, но это, похоже, не проблема.

Когда вы переходите к следующей странице, перед загрузкой изображений следующей страницы, если я вернусь назад к загруженному изображению предыдущей страницы, изображение будет покрыто другим изображением (которое должно отображаться на самой новой странице, а не на текущей странице …) (например, на первой странице у меня есть изображение, и на этом изображении есть кошка, а затем я прокручиваю вниз, пока не подтянется, чтобы запросить следующую страницу, и после получения всего URL-адреса следующего страницы, начните воспроизведение асинхронных потоков, прежде чем новые изображения загружаются, прокручиваются назад, наверху, возможно, на первой странице. Через некоторое время некоторые изображения загружены, они должны отображать в нем ячейку, но теперь изображения будут покрывать текущие изображения страницы, возможно, изображение кошки теперь имеет изображение собаки на нем ) что мне делать?

Когда строка прокручивается за кадром, представление таблицы повторно использует ячейку этой строки для другой строки, которая прокручивается на экране.

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

Вам нужно, чтобы источник данных в виде таблицы был делегатом для загрузчика фонового изображения. Он должен поместить индексный путь строки в словарь userInfo когда он вызывает downloadWithURL:delegate:options:userInfo: Когда загрузчик отправляет imageDecoder:didFinishDecodingImage:userInfo: в источник данных, источник данных должен получить индексный путь из пользовательской userInfo и использовать его, чтобы спросить представление таблицы для ячейки, отображающей эту строку (отправив cellForRowAtIndexPath: в таблицу Посмотреть).

  • Избавьтесь от заполнения для пользовательского аксессуара UITableViewCell
  • UICollectionView + AFNetworking + AutoScroll / Pagination?
  • Обнаружение столкновения во время CAKeyFrameAnimation
  • Плавная прокрутка UITableView при вызове reloadData
  • iOS - Повторное использование одного и того же дизайна ячейки и кода в нескольких представлениях
  • Как выйти из режима UITableViewCellEditingStyleDelete, когда пользователь редактирует его с помощью жестов
  • NSFileHandle & Writing Asych для файла в iOS
  • пользовательский интерфейс UItableView не отображается правильно на ios8
  • При нажатии на уже выбранную ячейку в UITableView вызывается вызов SelectCellAtIndexPath
  • С ARC, как правильно установить свойство с побочным эффектом?
  • Имея проблемы с вычислением точного общего расстояния ходьбы / пробега с помощью CLLocationManager
  • Давайте будем гением компьютера.