美文网首页
iOS tableView reloadData 刷新结束后执行

iOS tableView reloadData 刷新结束后执行

作者: Treey_Ahao | 来源:发表于2019-01-25 18:19 被阅读0次

    之前公司项目首页数据在加载完成之后会有一个新手引导层,后来项目要添加预加载,问题就来了,进入首页后tableView滚动位置不对,到不了最底部。

    // 加载数据
    [self.myTableView reloadData];
    // 滚动
    [self.myTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:([self.myTableView numberOfRowsInSection:2]-1) inSection:2] atScrollPosition:UITableViewScrollPositionBottom animated:NO];
    

    如果是需要[tableView reloadData]完成后获取tableView的cell、高度,直接在reloadData后执行会有问题,因为reloadData不会等tableView更新结束后才返回,而是立即返回,然后计算表高度,执行滚动之类的代码。
    很明显这里的原因是因为数据比较大,一个run loop周期没执行完,tableView滚动时,表的高度不对。

    解决方法:

    1、强制刷新

    [self.myTableView reloadData];
    [self.myTableView layoutIfNeeded]; 
    [self.myTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:([self.myTableView numberOfRowsInSection:2]-1) inSection:2] atScrollPosition:UITableViewScrollPositionBottom animated:NO];
    

    layoutIfNeeded会强制重绘并等待完成。

    2、线程等待

    [self.myTableView reloadData];
    dispatch_async(dispatch_get_main_queue(), ^{
              // 刷新
              [weakSelf.myTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:([weakSelf.myTableView numberOfRowsInSection:2]-1) inSection:2] atScrollPosition:UITableViewScrollPositionBottom animated:NO];
     });
    

    [tableView reloadData]在主队列执行,而dispatch_get_main_queue()会等待主队列空闲后才执行。
    参考链接

    相关文章

      网友评论

          本文标题:iOS tableView reloadData 刷新结束后执行

          本文链接:https://www.haomeiwen.com/subject/cxjvjqtx.html