所以我使用UITableViewDataSource
实现NSFetchedResultsController
协议。
然后我修改Core Data base的内容和NSFetchedResultsController
然后更新tableView ..
无论如何知道tableView何时重新加载数据?
我们有一个针对REST实现进行缓存的复杂数据模型,很难确定是否需要获取更多数据来填充屏幕(因为屏幕可能使用复杂的过滤器来对付加载的原始数据)。此外,UITableViewCell
对象不保证高度相同。
简单的答案是简单地将数据转储到核心数据,并使用NSFetchedResultsController
将数据提供给UITableView
。
以下是它的工作原理:
这会触发controllerDidChangeContent
方法触发,然后触发tableView reloadData(例如:)
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView reloadData];
}
然后我们基本上“检查”以查看页脚是否在250ms后仍然可见,方法是调用以下方法:
[self performSelector:@selector(checkIfFooterViewIsVisible) withObject:nil afterDelay:0.25];
- (void)checkIfFooterViewIsVisible
{
BOOL viewVisible = CGRectIntersectsRect(self.tableView.bounds,self.tableView.tableFooterView.frame);
if (viewVisible)
{
[self getMoreData];
}
我们还会在每次滚动时检查页脚是否在视图中。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
[self checkIfFooterViewIsVisible];
}
tableViewFooter
视图对象(因此无法看到它)。所以答案很酷,因为我们可以弄清楚是否需要提取更多数据,只有用户“需要”它。要么是因为第一批中没有太多可见数据,要么是因为它们已向下滚动并需要更多数据。检查tableFooterView
的当前位置让我们知道我们是否在屏幕上“绘制”了足够的数据。
问题是 - 我可以摆脱:
[self performSelector:@selector(checkIfFooterViewIsVisible) withObject:nil afterDelay:0.25];
如果我们设置延迟太快,则UITableView
没有时间更新屏幕(并更改页脚的位置)。如果我们更新得太慢,那么感觉就像应用程序在加载数据时“口吃”,并且可以加载数据的速度比它慢。但是不同的iOS设备(以及不同的网络覆盖范围)将意味着略有不同的时序,因此“让UITableView
更新并稍后检查”大部分时间都可以工作,但我觉得这样可以更顺畅。
无论如何(可能是因为重载UITableView
)我们可以确定UITableView
已“完成”加载UITableViewCell
个对象? (至少直到下一次滚动移动?)。添加这种奇怪的延迟效果很好,但如果我们明确知道[tableview reloadDate]
操作已经完成,它会更清晰。