在我的应用程序中,UITableview中的每个单元格都需要从API获取的数据。为了使应用程序看起来更快,我一次获取一个单元格的数据并使用[tableview reloadData]
显示它。但是在执行此操作时,视图控制器本身没有响应。我无法点击后退按钮或点击单元格(呼叫didSelectRowAtIndexPath
)。有解决方案吗? 我像这样调用reloadData
方法
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_async(queue, ^{
[tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
});
重新加载表主线程上的视图:
dispatch_async(queue, ^{
// Perform background task. Call webservice etc
dispatch_async(dispatch_get_main_queue(), ^
{
// Perform UI related tasks
[tableView reloadData];
}
});
您当前正在后面执行一个块,调用以在主线程中执行方法...这是多余的,您应该简单地调用[tableView reloadData]
。 如果调用reloadData
花费的时间太多,以至于冻结了您的 UI(表的重新加载必须在主 UI 线程上进行,并且不能在后面执行),那么您可能做错了什么。
如果有任何网络调用在任何表视图委托或数据源方法中同步完成,则应以异步方式在后面执行这些调用,然后仅在请求完成后重新加载表。
It',因为你只是阻塞了主线程。
您说您添加一个单元格时间,我想单元格内容是从一个 Web 服务返回的。这不是处理此类问题的最合适方法,还因为您可能会打开大量连接来下载填充表视图所需的数据。-reloadData
应该只在需要更新表格视图的所有内容时使用,如果要一次添加单元格,则应使用-insertRowsAtIndexPaths:withAnimation:
包装在-beginUpdates
和-endUpdates
内。
int requiredNumberOfCells = 10;
int currentNumberOfCells = 0;
[tableView reloadData];
dispatch_queue_t tableviewcell = dispatch_queue_create("tableviewcell", NULL);
dispatch_async(tableviewcell, ^{
for (int i = 1;i<=requiredNumberOfCells;i++){
//Fetch details for each cell here
currentNumberOfCells = i;
dispatch_async(dispatch_get_main_queue(), ^{
[tableView reloadData];
});
}
});