你怎么知道UITableView什么时候更新它的视图?

时间:2012-09-18 16:30:31

标签: iphone ios uitableview

所以我使用UITableViewDataSource实现NSFetchedResultsController协议。

然后我修改Core Data base的内容和NSFetchedResultsController然后更新tableView ..

无论如何知道tableView何时重新加载数据?

我们有一个针对REST实现进行缓存的复杂数据模型,很难确定是否需要获取更多数据来填充屏幕(因为屏幕可能使用复杂的过滤器来对付加载的原始数据)。此外,UITableViewCell对象不保证高度相同。

简单的答案是简单地将数据转储到核心数据,并使用NSFetchedResultsController将数据提供给UITableView

以下是它的工作原理:

  • 我们添加了一个tableview.tableFooterView,显示我们的“数据加载”消息。
  • 从REST API加载一批数据,然后使用它更新我们的Core Data对象。
  • 这会触发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]操作已经完成,它会更清晰。

0 个答案:

没有答案