Я получил 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
, поэтому я могу получить его, когда строка прокручивается за пределы экрана и обратно в (, и строка воссоздается ).
Поскольку количество изображений в одном представлении может достигать 2000 -3000, я также кэширую изображения на диск и удаляю изображения из NSDictionary
, когда они находятся дальше X строк. Когда пользователь прокручивает вниз и снова вверх, происходит следующее:
UIImage
добавлен к NSDictionary
для более быстрого кэширования изображений, которые должны быть в пределах досягаемости.NSDictionary
из-за проблем с памятью (слишком много UIImage
объектов в NSDictionary
причиной -нехватки -памяти ошибки ).Когда UITableView почти достигает конца, происходит следующее:
numberOfItemsInSection
.reloadData
вызывается, чтобы убедиться, что UITableView
заполнен дополнительными новыми строками.Итак, у меня проблема, когда я добавляю новые записи из веб-сервиса. Когда я вызываю reloadData
на UITableView
, некоторые изображения снова загружаются с диска, и при прокрутке возникают некоторые зависания.
Я ищу решение для этого. Я попытался использовать insertItemsAtIndexPaths
с количеством новых строк, чтобы добавить их к UITableView
, но это заставляет мой метод ленивой загрузки уже загружать изображения (, потому что каким-то образом все ячейки создаются в это время, даже когда они не видны, проверка видимости ячейки во время создания дает неожиданные результаты, изображения не загружаются, ячейки выглядят странно и т. д. ).
Итак, то, что я, по сути, ищу, - это решение для бесконечной прокрутки UITableView, которое лениво загружает изображения из Интернета/диска и работает так же плавно, как приложение для фотографий. Поскольку все изображения загружаются в отдельные потоки, я не понимаю, почему прокрутка не такая гладкая, как кожа ребенка.