我有一个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
(如果未加载)或部分标题(如果已加载)