iOS tableView reloadData 刷新结束后执行下一步操作

之前公司项目首页数据在加载完成之后会有一个新手引导层,后来项目要添加预加载,问题就来了,进入首页后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()会等待主队列空闲后才执行。
参考链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,161评论 1 32
  • 一、简介 <<UITableView(或简单地说,表视图)的一个实例是用于显示和编辑分层列出的信息的一种手段 <<...
    无邪8阅读 10,751评论 3 3
  • UI viewcontroller的一些方法的说明viewDidLoad,viewWillDisappear, v...
    b485c88ab697阅读 3,609评论 0 22
  • 概述在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似...
    liudhkk阅读 9,101评论 3 38
  • 年轻 些许的人,些许的雨,穿梭在风里,交织进黄昏。看到了似曾相识的年轻,那时总是迷茫地要些什么、忘些什么、恨些什么...
    岸边的鱼哥哥阅读 206评论 0 0