执行 [表视图重新加载数据] 时交互不起作用



在我的应用程序中,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];
});
}
});

最新更新