带有多个section的UITableView加载不稳定



我有一个UITableView (TV)有几个部分,每个部分都有一个NSArray作为数据源(没有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,并为dispatch_group_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(如果未加载)或部分标题(如果已加载)

最新更新