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]
。我认为即使有延迟,最终看起来也会顺利得多。我会发布更新后的代码,一旦我对它感到满意。