我有一个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);
答案 0 :(得分:2)
如果从nil
返回tableView:titleForHeaderInSection:
,则表示不会显示标题,因此添加少量条件逻辑,检查数据是否已加载并返回{{1 (如果没有加载)或节标题(如果已加载)。