UITableView с бесконечной прокруткой и ленивой загрузкой

Я получил UITableView который заполнен неизвестным количеством строк. Каждая строка содержит (например, 3) изображения, и приложение собирает эту информацию из веб-службы.

Для UITableView я реализовал бесконечную прокрутку. Всякий раз, когда таблица почти достигает конца текущего количества строк, я инициирую вызов в веб-службу, чтобы получить следующие 50 строк данных. Я делаю это в методе scrollViewDidScroll который вызывается UITableView .

 - (void) scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat actualPosition = scrollView.contentOffset.y; float bottomOffset = 450; if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) bottomOffset = 1000; CGFloat contentHeight = scrollView.contentSize.height - bottomOffset; if (actualPosition >= contentHeight && !_loading && !_cantLoadMore) { self.loading = YES; _currentPage++; NSMutableDictionary* dict = [[NSMutableDictionary alloc] init]; [dict setObject:[NSNumber numberWithInt:_currentPage] forKey:@"page"]; [dict setObject:[_category objectForKey:@"ID"] forKey:@"category"]; [self performSelectorInBackground:@selector(getWallpapersInBackground:) withObject:dict]; } } 

Изображения в строках UITableView загружаются лениво. Всякий раз, когда строка видима, изображения загружаются в отдельный поток, и строки обновляются после полной загрузки изображения. Принцип, который я использую для ленивой загрузки, аналогичен тому, как Apple предлагает в своей документации. Изображение также добавляется в локальный NSDictionary , поэтому я могу получить его, когда строка прокручивается из экрана и обратно (и воссоздана строка).

Поскольку количество изображений в одном представлении может увеличиться до NSDictionary , я также NSDictionary изображения на диск и NSDictionary изображения из NSDictionary когда они находятся дальше, чем X строк. Когда пользователь прокручивается вниз и снова, происходит следующее:

  1. Отображаются новые строки
  2. Вызывается ленивый метод загрузки, который проверяет наличие изображения на диске или его загрузку.
  3. Когда изображение загружается или извлекается с диска, он выполняет кодовый блок, который отображает изображение в строке. Изображения, загруженные из Интернета, также кэшируются на диск.
  4. UIImage добавлен в NSDictionary для более быстрого кэширования изображений, которые должны быть доступны.
  5. Изображения, которые находятся в строках, 15 строк или далее из видимых строк, удаляются из NSDictionary из-за проблем с памятью (слишком много объектов UIImage в NSDictionary вызывают NSDictionary из-за памяти).

Когда UITableView почти достигает конца, происходит следующее:

  1. UITableView почти достигает конца загруженных строк
  2. Вызов в webservice с множеством новых строк (50)
  3. Новые строки добавляются в массив, который используется для метода numberOfItemsInSection .
  4. reloadData чтобы убедиться, что UITableView заполняется дополнительными новыми строками.
  5. Новые строки, содержащие изображения, выполняют описанные выше шаги для ленивой загрузки изображений.

Итак, проблема заключается в том, что я добавляю новые записи из webservice. Когда я вызываю reloadData в UITableView некоторые изображения снова загружаются с диска, и при прокрутке появляются некоторые завитки.

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

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

Я не уверен, полностью ли я заполняю полноту вашего вопроса, но вот некоторые вещи, которые я сделал, столкнувшись с подобной проблемой.

  • Я использовал -tableView:cellForRowAtIndexPath: как мой реплик для загрузки большего количества данных из Интернета. Я выбрал номер (в моем случае 10), когда indexPath.row + 10 >= self.data.count загружает больше данных.

    • Мне нужно было вызвать -tableView:cellForRowAtIndexPath: любом случае.
    • Я не заставлял обратный вызов в более жесткий цикл -scrollViewDidScroll:
  • Я подклассифицировал UIImageView с классом, который будет асинхронно загружать изображения, которые я назвал URLImageView .

    • In -tableView:cellForRowAtIndexPath: я назначил URL- URLImageView экземпляру URLImageView .
    • Это назначение вызвало фоновую операцию, которая либо загружалась с диска, либо загружалась из Интернета.
    • Операция была отменена, поэтому я не работал над изображением, которое больше не нуждалось в загрузке.

У меня был вид таблицы с сотнями (но не тысячами) изображений. У меня было только 2 или 3 ячейки таблицы на экране одновременно.

  • Я использовал -refreshData : он работал как чемпион.
  • Я даже получил URLImageView чтобы исчезнуть в изображении. Это был очень хороший эффект.

Надеюсь, это поможет.

чтобы избежать мерцающей попытки вызова beginUpdates в таблице, тогда insertrowAtIndexPaths:withRowAnimations: и закончите с endUpdates .

Удачи.

  • Как реализовано представление приложения iPhone Contact app
  • Как центрировать subview
  • Как popToRoot на одной вкладке, когда пользователь находится на другой вкладке?
  • Как получить Wi-Fi SSID в iOS9 после того, как CaptiveNetwork устарела и требует имя Wifi, уже заблокировано
  • Затухание элементов в UICollectionView
  • Недействительность NSTimer в dealloc
  • Создание настраиваемого шаблона в Xcode - как я могу сделать требуемый параметр на основе флажка?
  • Как я могу искать и удалять экранированный символ из NSString?
  • Xcode 4 устанавливает зависимость статической библиотеки с различными настройками конфигурации
  • Как скрыть ползунок воспроизведения в Центре управления iOS?
  • Добавление кнопки «Очистить» на iPhone UITextField
  • Давайте будем гением компьютера.