У меня есть UITableView
, который заполнен неизвестным количеством строк. Каждая строка содержит (например, 3) изображения, и приложение собирает эту информацию из веб-службы.UITableView с бесконечной прокруткой и ленивой загрузкой
Для 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
, поэтому я могу получить его, когда строка прокручивается из экрана и обратно (и строка воссоздана).
Поскольку количество изображений в одном представлении может увеличиться до 2000 - 3000, я также кэширую изображения на диск и очищаю изображения от NSDictionary
, когда они находятся дальше, чем X строк. Когда пользователь прокручивает вниз и снова происходит следующее:
- Новые строки отображаются
- Ленивый метод загрузки называется, которая проверяет, если изображение присутствует на диске, или что он должен загрузить его.
- Когда изображение загружается или извлекается с диска, он выполняет кодовый блок, который отображает изображение в строке. Изображения, загруженные из Интернета, также кэшируются на диск.
UIImage
добавлен вNSDictionary
для более быстрого кэширования изображений, которые должны быть в пределах досягаемости.- Изображения, которые находятся в строках, 15 строк или дальше от видимых строк, удаляются из
NSDictionary
из-за проблем с памятью (слишком многоUIImage
объектов вNSDictionary
вызывают ошибки из-за памяти).
Когда UITableView почти доходит до конца, происходит следующее:
- UITableView почти достигает конца загруженных строк
- вызовов в WebService, с нагрузками новых рядов (50)
- Новые строки добавляются в массив, который используется для метода
numberOfItemsInSection
. - A
reloadData
вызывается, чтобы убедиться, чтоUITableView
заполняется дополнительными новыми строками. - Новые строки, содержащие изображения, выполняют описанные выше шаги для ленивой загрузки изображений.
Итак, проблема заключается в том, что я добавляю новые записи из веб-службы. Когда я вызываю reloadData
на UITableView
, некоторые изображения снова загружаются с диска, и при прокрутке появляются некоторые завитки.
Я ищу решение для этого.Я попытался использовать insertItemsAtIndexPaths
с количеством новых строк, чтобы добавить их в UITableView
, но это делает мой ленивый метод загрузки уже загружает изображения (потому что так или иначе все ячейки создаются в то время, даже когда они не видны, проверяя, ячейка видна во время создания, дает неожиданные результаты, изображения не загружаются, ячейки выглядят странно и т. д.).
Итак, что я, по сути, ищу, является решением для бесконечного прокрутки UITableView, который ленив загружает изображения с веб-диска и так же гладко, как и приложение для фото. Поскольку изображения загружаются в отдельные потоки, я не понимаю, почему прокрутка не такая гладкая, как кожа ребенка.
[KTPhotoBrowser] (https://github.com/kirbyt/KTPhotoBrowser) - очень хорошая библиотека для просмотра, загрузки и кеширования фотографий. Вы можете изменить его в соответствии с вашими потребностями. – Hejazi