我有一个简单的 iPhone 应用程序,它从 rss 提要解析数据(标题、图像等)并显示在 tableview 中。
viewDidLoad 有一个初始计数器值,通过调用 fetchEntriesNew 方法到达提要的第一页并加载到 tableview 中:
- (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];
}
}
UPDATE2:这里有一个更容易理解的关于我无法解决的错误的描述:例如,RSS 提要的每一页都有 10 个条目。应用程序启动,标题和其他标签立即加载,图像开始延迟加载,最后完成。到目前为止,一切都很好。用户滚动到底部,到达底部将使用滚动委托方法,计数器从 1 增加到 2,告诉 fetchEntriesNew 方法到达 rss 提要的第二页。该程序将开始在之前获取的前 10 个条目的底部加载接下来的 10 个条目。这可以继续,每次用户滚动并到达底部时,程序将再获取 10 个条目,并且新行将放置在先前获取的行下方。到目前为止,一切都很好。
现在让我们说用户当前在页面 3 上,该页面已经完全加载了图像。由于第 3 页已完全加载,这意味着当前表格视图中有 30 个条目。用户现在滚动到底部,计数器增加,并且 tableview 开始从前 30 个条目底部的 rss 提要的第 4 页填充新行。标题快速填充,从而构建行,当图像被下载(尚未完全下载)时,用户再次快速移动到底部,而不是在第 4 页底部加载第 5 页,它将破坏第 4 页目前正在下载并开始再次加载第四个。
它应该做的是,当用户到达表格视图的底部时,它应该保留下一页的标题等,而不管前一页的图像是否正在下载。
在我的项目中下载和持久化数据没有问题,并且所有数据都在应用程序运行之间持久化。
有人可以帮助我指出正确的方向。提前致谢。
更新 3:根据@Sergio 的回答,这就是我所做的:
1) 添加了另一个对archiveRootObject [NSKeyedArchiver archiveRootObject:channelCopy toFile:cachePath]的调用;[channelCopy addItemsFromChannel:obj] 之后;
在这一点上,它不会一次又一次地破坏和重新加载同一批次,这正是我想要的。但是,如果我多次滚动以到达下一页而没有完全加载上一页的图像,它不会保留图像。
2)我不确定如何使用 Bool,正如他在答案中解释的那样。这就是我所做的:添加了@property Bool myBool; 在 TheFeedStore 中,合成它并在新添加 archiveRootObject:channelCopy 后将其设置为 NO,并在 fetchEntries 方法一开始在 ListViewController 中将其设置为 YES。它没有用。
3)我也意识到我处理整个问题的方式是性能不是更好。虽然我不知道如何在缓存之外使用图像并将它们作为缓存处理。您是否建议对图像使用单独的存档文件?
非常感谢所有为解决我的问题做出贡献的人。