正在执行[tableview reloadData]时,交互不起作用

时间:2015-05-06 10:47:41

标签: ios objective-c uitableview xcode6

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

4 个答案:

答案 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];
    });
 }
});