Изображение таблицы TableView, которое асинхронно загружается, мерцает при быстром прокрутке

Я использую асинхронный блок (Grand central dispatch) для загрузки изображений с моей ячейки. Однако, если вы быстро пролистаете, они все равно появляются, но очень быстро, пока не загрузится правильный. Я уверен, что это обычная проблема, но я не могу найти ее.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; // Load the image with an GCD block executed in another thread dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[[appDelegate offersFeeds] objectAtIndex:indexPath.row] imageurl]]]; dispatch_async(dispatch_get_main_queue(), ^{ UIImage *offersImage = [UIImage imageWithData:data]; cell.imageView.image = offersImage; }); }); cell.textLabel.text = [[[appDelegate offersFeeds] objectAtIndex:indexPath.row] title]; cell.detailTextLabel.text = [[[appDelegate offersFeeds] objectAtIndex:indexPath.row] subtitle]; return cell; } 

4 Solutions collect form web for “Изображение таблицы TableView, которое асинхронно загружается, мерцает при быстром прокрутке”

По крайней мере, вы, вероятно, захотите удалить изображение из ячейки (в случае, если оно повторно используется ячейкой) перед dispatch_async :

 cell.imageView.image = [UIImage imageNamed:@"placeholder.png"]; 

Или

 cell.imageView.image = nil; 

В tableView:cellForRowAtIndexPath: , например:

 static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; cell.imageView.image = [UIImage imageNamed:@"placeholder.png"]; // Load the image with an GCD block executed in another thread dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[[appDelegate offersFeeds] objectAtIndex:indexPath.row] imageurl]]]; if (data) { UIImage *offersImage = [UIImage imageWithData:data]; if (offersImage) { dispatch_async(dispatch_get_main_queue(), ^{ UITableViewCell *updateCell = [tableView cellForRowAtIndexPath:indexPath]; if (updateCell) { updateCell.imageView.image = offersImage; } }); } } }); cell.textLabel.text = [[[appDelegate offersFeeds] objectAtIndex:indexPath.row] title]; cell.detailTextLabel.text = [[[appDelegate offersFeeds] objectAtIndex:indexPath.row] subtitle]; return cell; 

Честно говоря, вы также должны использовать кеш, чтобы избежать повторного получения изображений без необходимости (например, вы прокручиваете вниз и прокручиваете резервные копии, вы не хотите выдавать сетевые запросы для изображений предыдущих ячеек). Еще лучше, вы должны использовать одну из категорий UIImageView (например, включенную в SDWebImage или AFNetworking ). АПАР-АПЦ Филиппиль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нуль Нульонльсовой «Не хочу ждать, пока первые 99 будут извлечены, прежде чем показывать пользователю изображение для 100-й строки).

Это проблема с загрузкой асинхронного изображения … Предположим, у вас есть 5 видимых строк в любой момент времени. Если вы быстро прокручиваете и прокручиваете, например, 10 строк, tableView:cellForRowAtIndexPath будет называться 10 раз. Дело в том, что эти вызовы быстрее, чем возвращаются изображения, и у вас есть 10 ожидающих изображений из разных URL-адресов. Когда изображения, наконец, вернутся с сервера, они будут возвращены на те ячейки, которые вы положили в асинхронный загрузчик. Поскольку вы повторно используете только 5 ячеек, некоторые из этих изображений будут отображаться дважды в каждой ячейке, поскольку они загружаются с сервера, и именно поэтому вы видите мерцание. Кроме того, не забудьте позвонить

cell.imageView.image = nil

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

Путь вокруг этого заключается в том, чтобы сохранить последний URL-адрес изображения, которое вы должны отображать в каждой ячейке, а затем, когда изображение возвращается с сервера, проверьте этот URL с тем, который у вас есть в вашем запросе. Если это не то же самое, кешируйте это изображение позже. Для запросов кэширования ознакомьтесь с классами NSURLRequest и NSURLConnection .

Я настоятельно рекомендую вам использовать AFNetworking для любой связи с сервером.

Удачи!

Либо Филиппильф Филипль Нуль Нуль Нуль Нуль Нуль Нульван Мак Нульль Нуль Нуль Нульван Мак Нульль Нуль Нульванль Мак Нуль Нуль Нульмонд Нуль Нульмонд Нуль Нульмонд Нуль Нульмонд Нульбальм Мак Нуль Нульвальмным Филиппиль Нуль Нуль Нульмонд Нуль Нульварит Бунльбальтер Мак Нуль Нульзантольм Филиппильм Нуль Нульвальд Мак Нуль Нуль Нульвальд Мак Нуль Нульвальмным Филиппиль Нупар Нуль Нуль Нульвальд Мак Нуль Нульвальмным Филиппиль Нуль Нуль Нуль Нульварит Бунльбо Филиппильм Филиппильм Филиппильм Филиппильм Филиппильм Нуль Нуль Нуль Нуль Нульван Мак Нульль Нуль Нульвальд Мак Нуль Нуль Нульванко Филиппильм Филиппильм Филиппильм Филиппильм Нуль Нуль Нуль Нуль Нульварит Филиппильм Филиппильм Филиппильм Нуль Нульсовой Филиппильм Филиппильм Нуль Нульсовой Филиппильм Нуль Нульвальд установлен на ячейке, так что если вы быстро прокрутите, вы используете, скажем, ячейку 3 раза = 3 запроса, которые будут запущены = 3 изображения будут установлены на этой ячейке = мерцание.

У меня была такая же проблема, и вот мой подход: создайте пользовательскую ячейку со всеми необходимыми представлениями. Каждая ячейка имеет свою собственную операцию загрузки. В методе -prepareForReuse . Я бы сделал изображение нулем и отменил запрос.

Таким образом, для каждой ячейки у меня есть только одна операция запроса = одно изображение = нет мерцания.

Даже используя AFNetworking вы можете иметь такую ​​же проблему, если не будете отменять загрузку изображения.

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

 dispatch_queue_t myQueue = dispatch_queue_create("myQueue", NULL); // execute a task on that queue asynchronously dispatch_async(myQueue, ^{ NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[[appDelegate offersFeeds] objectAtIndex:indexPath.row] imageurl]]]; //UI updates should remain on the main thread UIImage *offersImage = [UIImage imageWithData:data]; dispatch_async(dispatch_get_main_queue(), ^{ UIImage *offersImage = [UIImage imageWithData:data]; cell.imageView.image = offersImage; }); }); 
  • Как обновить UITableView во время выполнения, после загрузки представления
  • UITableView отключает выделение между выборами ячейки
  • Вид таблицы, обозначающий более чем одну ячейку Swift 3
  • Как сделать мой RefreshControl появляться во время ViewDidAppear
  • Динамическое изменение ширины метки внутри UITableViewCell
  • Прокрутка UITableView до конца испорчена с помощью EstimatedRowHeight
  • Постоянно обновлять UISlider в UITableViewCell
  • Вызов viewWillAppear в UITableviewController
  • Обновить данные UITableView в фоновом режиме
  • indexPathsForVisibleRows возвращает общий размер таблицы вместо видимого после изменения размера
  • Загрузка iOS - UILabel, но отображение текста
  • Interesting Posts

    FBSessionStateClosedLoginFailed каждый раз, когда я пытаюсь войти в мое приложение

    Управление событиями в пользовательском UIControl

    Камера iOS MapKit сбрасывает значения заголовка между 6 и 354

    стандартное отклонение UIImage / CGImage

    NSFetchedResultsController пытается вставить нулевой объект

    активировать ограничения в uitableviewcell не работает в первый раз

    как однозначно идентифицировать устройство ios

    Как удалить изображение из каталога активов в Today Extension?

    Как преобразовать AVFrame FFMPEG в YUVJ420P в AVFoundation cVPixelBufferRef?

    Локализация Xcode 6. файл экспорта .xliff вырезает строку, когда строка похожа на «это образец», текст «"

    Невозможно отключить меню выбора копирования / определения в UIWebView

    Как уменьшить использование памяти при рендеринге страницы PDF в CGBitmapContext?

    Как настроить видимость областей UISearchBar?

    Создание линейного поля тяжести в Swift

    Добавление новой цели в xcode 4.2

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.