通过预加载单元格来提高UITableView的性能

时间:2014-06-18 17:41:35

标签: ios cocoa-touch uitableview uipageviewcontroller

我有UIPageViewController,其中每个网页的视图都包含UITableView。我希望在控制器之间进行分页时提高性能。

我正在方便的时刻在当前页面的任一侧预加载一些控制器,并要求他们查看以确保所有内容都提前呈现。但真正的瓶颈实际上是tableview的单元格,它们没有预先加载:

MyViewController *vc = [[MyViewController alloc] initWithNibName:nil bundle:nil];

[vc view];
NSLog(@"view: %@", vc.view); // view exists

[vc tableview];
NSLog(@"tableview: %@", vc.tableview); // tableview exists

UITableViewCell *cell = [vc.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
NSLog(@"cell: %@", cell); // cell is null??

如日志记录所示,在桌面视图实际显示在屏幕上之前,单元格本身不会被加载。

如何让屏幕外UITableView提前将其可见细胞出列?

1 个答案:

答案 0 :(得分:3)

它返回nil是因为当你调用[vc.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];时,你正在调用表视图对象上的方法,而不是数据源(即视图控制器)。

这与您在数据源(即视图控制器)上调用- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath表视图不同,这是您创建单元格的地方。

您正在调用的方法要求表视图返回它已经为您传入的索引路径所拥有的单元格。由于tableview在此阶段没有向您的数据源询问任何单元格(如它没有被看见,它没有细胞给你,因此返回零。

如果要预加载单元格,可以在后台线程上创建第一批,通过为初始行制作索引路径,并要求数据源返回单元格。将它们存储在一个数组中,然后让- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath的实现在表视图请求时返回数组中初始化的单元格,用于前几个索引路径。