在我的应用中,UITableview中的每个单元格都需要从API获取的数据。为了使应用程序看起来更快,我一次获取一个单元格的数据并使用[tableview reloadData]
显示它。但是在执行此操作时,ViewController本身没有响应。我无法点击后退按钮或点击一个单元格(拨打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];
});
答案 0 :(得分:4)
在主线程上重新加载tableView:
dispatch_async(queue, ^{
// Perform background task. Call webservice etc
dispatch_async(dispatch_get_main_queue(), ^
{
// Perform UI related tasks
[tableView reloadData];
}
});
答案 1 :(得分:0)
您当前正在后面执行一个块,调用在主线程中执行方法......这是多余的,您只需调用[tableView reloadData]
即可。
如果调用reloadData
需要花费很多时间来冻结你的UI(表的重新加载必须在主要的UI线程上进行,并且不能在后面执行)那么你可能做错了。< / p>
如果在任何表视图委托或数据源方法中同步完成任何网络调用,那么您应该在后面以异步方式执行它们,然后只在请求完成时重新加载表。
答案 2 :(得分:0)
它'因为你只是阻止主线程
你说你添加一个单元格时间我想从一个Web服务返回单元格内容。这不是解决这类问题的最合适方式,也是因为您可能需要打开大量连接来下载填充表格视图所需的数据。
只有在需要更新表视图的所有内容时才应使用-reloadData
,如果要在时间添加单元格,则应使用-insertRowsAtIndexPaths:withAnimation:
包裹在-beginUpdates
和{{1}中}}
答案 3 :(得分:0)
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];
});
}
});