У меня есть простое приложение для iPhone, которое анализирует данные (заголовки, изображения и т. д.) из RSS-канала и показывает их в виде таблицы.
ViewDidLoad имеет начальное значение счетчика для достижения первой страницы канала и загрузки в табличном представлении путем вызова метода fetchEntriesNew:
- (void)viewDidLoad
{
[super viewDidLoad];
counter = 1;
[self fetchEntriesNew:counter];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(dataSaved:)
name:@"DataSaved" object:nil];
}
- (void) fetchEntriesNew:(NSInteger )pageNumber
{
channel = [[TheFeedStore sharedStore] fetchWebService:pageNumber withCompletion:^(RSSChannel *obj, NSError *err){
if (!err) {
int currentItemCount = [[channel items] count];
channel = obj;
int newItemCount = [[channel items] count];
NSLog(@"Total Number Of Entries Are: %d", newItemCount);
counter = (newItemCount / 10) + 1;
NSLog(@"New Counter Should Be %d", counter);
int itemDelta = newItemCount - currentItemCount;
if (itemDelta > 0) {
NSMutableArray *rows = [NSMutableArray array];
for (int i = 0; i < itemDelta; i++) {
NSIndexPath *ip = [NSIndexPath indexPathForRow:i inSection:0];
[rows addObject:ip];
}
[[self tableView] insertRowsAtIndexPaths:rows withRowAnimation:UITableViewRowAnimationBottom];
[aiView stopAnimating];
}
}
}];
[[self tableView] reloadData];
}
Когда пользователь достигает нижней части табличного представления, я использую следующее, чтобы перейти к следующей странице канала и загрузить ее в нижней части первой страницы, которая была загружена первой:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height;
if (endScrolling >= scrollView.contentSize.height)
{
NSLog(@"Scroll End Called");
NSLog(@"New Counter NOW is %d", counter);
[self fetchEntriesNew:counter];
}
}
ОБНОВЛЕНИЕ 2: Вот более простое для понимания описание того, что не так, что я не могу решить: например, на каждой странице RSS-канала есть 10 записей. Приложение запускается, заголовки и другие метки загружаются немедленно, а изображения начинают загружаться лениво и, наконец, завершаются. Все идет нормально. Пользователь прокручивает, чтобы достичь нижней части, при достижении нижней части будет использоваться метод делегата прокрутки, а счетчик увеличивается с 1 до 2, сообщая методу fetchEntriesNew о достижении второй страницы RSS-канала. Программа начнет загрузку следующих 10 записей в нижней части первых 10 ранее выбранных. Это может продолжаться, и программа будет получать еще 10 записей каждый раз, когда пользователь прокручивает и достигает нижней части, а новые строки будут размещаться ниже ранее выбранных. Все идет нормально.
Теперь предположим, что пользователь в настоящее время находится на странице 3, которая полностью загружена изображениями. Поскольку страница 3 загружена полностью, это означает, что в настоящее время в таблице 30 записей. Теперь пользователь прокручивается вниз, счетчик увеличивается, и табличное представление начинает заполнять новые строки со страницы 4 rss-канала в нижней части первых 30 записей. Заголовки быстро заполняются, таким образом строятся строки, и пока изображения загружаются (еще не загружены полностью), пользователь снова быстро перемещается вниз, вместо загрузки 5-й страницы внизу 4-й, он уничтожит 4-е. который в настоящее время находится в процессе загрузки и снова начинает загружать 4-й.
Что он должен сделать, так это сохранить заголовки и т. Д. Со следующих страниц, когда пользователь достигает нижней части таблицы, независимо от того, находятся ли изображения предыдущих страниц в середине загрузки или нет.
Нет проблем с загрузкой и сохранением данных в моем проекте, и все данные сохраняются между запусками приложения.
Может кто-нибудь помочь указать мне в правильном направлении. Заранее спасибо.
ОБНОВЛЕНИЕ 3: Основываясь на ответе @Sergio, я сделал следующее:
1) Добавлен еще один вызов archiveRootObject [NSKeyedArchiver archiveRootObject:channelCopy toFile:cachePath]; после [channelCopy addItemsFromChannel:obj];
На данный момент он не уничтожает и не перезагружает одну и ту же партию снова и снова, именно то, что я хотел. Однако он не сохраняет изображения, если я прокручиваю несколько раз, чтобы перейти к следующей странице, если изображения предыдущей страницы не были загружены полностью.
2) Я не уверен, как использовать Bool, как он объяснил в ответе. Вот что я сделал: добавил @property Bool myBool; в TheFeedStore синтезировал его и установил для него значение NO после только что добавленного archiveRootObject:channelCopy и установил для него значение YES в ListViewController в самом начале метода fetchEntries. Это не сработало.
3) Я также понял, что то, как я решаю эту проблему, не улучшает производительность. Хотя я не знаю, как использовать изображения вне кеша и обрабатывать их как своего рода кеш. Вы предлагаете использовать отдельный архивный файл для изображений?
Большое спасибо всем людям, которые внесли свой вклад в решение моей проблемы.