Ios UITableView具有多个部分负载波动
我有一个Ios UITableView具有多个部分负载波动,ios,uitableview,grand-central-dispatch,Ios,Uitableview,Grand Central Dispatch,我有一个UITableView(电视)有几个部分,每个部分都有一个NSArray,作为数据源(没有核心数据,没有图像)。当用户打开电视时,我的应用程序会进行一些密集的计算以生成数据源阵列。在某些情况下,计算可能需要一些时间,然后发生的事情是首先显示节标题,然后显示单元格,我认为这不太好 我已经在使用GCD进行计算: - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear: animated]; [MBProgr
UITableView
(电视)有几个部分,每个部分都有一个NSArray
,作为数据源(没有核心数据,没有图像)。当用户打开电视时,我的应用程序会进行一些密集的计算以生成数据源阵列。在某些情况下,计算可能需要一些时间,然后发生的事情是首先显示节标题,然后显示单元格,我认为这不太好
我已经在使用GCD进行计算:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear: animated];
[MBProgressHUD showHUDForView: self.view animated: YES];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
[self.model generateData];
dispatch_async(dispatch_get_main_queue(), ^{
[MBProgressHUD hideHUDForView: self.view animated: YES];
[self.tableView reloadData];
});
});
}
除了尝试优化计算之外,我还能做些什么来让它看起来更平滑吗?例如,是否有一种方法可以使节标题在计算完成之前不显示
更新:
所以最后,我的解决方案不同了。为了生成数据,我现在使用dispatch\u group
,并为dispatch\u group\u async
块中的每个部分计算NSArray
,以便它们同时运行。这已经是速度上的进步。此外,我已经在用户打开电视的UIViewController
中启动了计算。因此,当电视打开时,数据几乎立即可用,并且所有部分都能顺利加载
以下是完整的代码片段:
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) ^{
[self.model generateArray1];
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) ^{
[self.model generateArray2];
});
//... etc for each section
// make sure that everything is done before moving on
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
如果从
tableView:titleForHeaderInSection:
返回nil
,则不会显示标题,因此添加少量条件逻辑,检查数据是否已加载,并返回nil
(如果未加载)或节标题(如果已加载)。这使我走上了正确的轨道。我还研究了tableView:willDisplayHeaderView:forSection:
,但还没有决定什么是最合适的。在尝试了很多这种方法之后,不幸的是,不同部分的单元格在每个可用时仍将以块的形式出现。即使没有丢失的标题,我认为它仍然不好看。因此,为了完整起见,我现在的计划是并发计算所有数组,在它们全部完成之前,不要调用[self.tableView reloadData]
。我认为即使有延迟,最终看起来也会顺利得多。我会发布更新后的代码,一旦我对它感到满意。