我有一个刷新按钮来获取当前数据并重新加载 tableView。我正在使用这种方法来做到这一点:
[self getCurrentData];
[self changeArrayObjectsWithNewDatas];
[self.myTableView reloadData];
但过了一会儿,应用程序变慢了。这就是为什么我正在寻找 [myTableView reloadData] 的有效替代方案
我有一个刷新按钮来获取当前数据并重新加载 tableView。我正在使用这种方法来做到这一点:
[self getCurrentData];
[self changeArrayObjectsWithNewDatas];
[self.myTableView reloadData];
但过了一会儿,应用程序变慢了。这就是为什么我正在寻找 [myTableView reloadData] 的有效替代方案
reloadData
并不慢。您的应用程序的响应工作负载reloadData
很慢。
您需要使用 Instruments 分析您的应用程序,确定什么是慢的,并将其修复为不慢或在不同的位置完成。
如果您的应用程序随着时间的推移而变慢,很可能是因为您在每次数据加载时都在增加状态。也就是说,您可能会保留先前的结果集而不是发布它。
您必须显示更多代码,然后才能更直接地回答这个问题。具体来说,UITableViewDataSource 方法的实现是什么样的?
问题可能是您在主线程中重新加载数据,只有 UI 应该在主线程中处理。
试试这个:
- (void)fetchCurrentDataWithCompletion:(void (^)())completion
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
// Handle your loading
[self changeArrayObjectsWithNewDatas];
if (completion) {
completion();
}
}
}
然后:
[self fetchCurrentDataWithCompletion:^{
dispatch_async(dispatch_get_main_queue(), ^{
[self.myTableView reloadData];
});
}];
您可以做的是仅更改数组中为屏幕上已经可见的单元格提供数据的那些值。visibleCells 返回屏幕上当前可见单元格的数组。更改值后,您可以手动更新这些单元格上显示的数据(即不使用 [myTableView reloadData] 数据),只需确保在主线程上执行此操作。
然后,您可以在单独的(即非主)线程中更改数组中的其余值。
为了安全起见,您可以更改可见单元格的值 +- 一些单元格以防万一用户滚动很多..