具有多个部分的UITableView加载不稳定

时间:2014-08-03 18:12:16

标签: ios uitableview grand-central-dispatch

我有一个UITableView(电视),其中有几个部分,每个部分都有NSArray作为dataSource(没有CoreData,没有图像)。当用户打开电视时,我的应用程序会进行一些密集计算以生成dataSource数组。在某些情况下,计算可能需要一些时间,然后会发生的事情是,首先显示部分标题,然后显示单元格,我认为这并不好。

我已经在使用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_group,并计算NSArray块中每个部分的dispatch_group_async,以便它们同时运行。这已经是速度的提高。此外,我开始在用户打开电视的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);

1 个答案:

答案 0 :(得分:2)

如果从nil返回tableView:titleForHeaderInSection:,则表示不会显示标题,因此添加少量条件逻辑,检查数据是否已加载并返回{{1 (如果没有加载)或节标题(如果已加载)。