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阅读 10,550评论 1 32
  • 一、简介 <<UITableView(或简单地说,表视图)的一个实例是用于显示和编辑分层列出的信息的一种手段 <<...
    无邪8阅读 9,839评论 3 3
  • UI viewcontroller的一些方法的说明viewDidLoad,viewWillDisappear, v...
    b485c88ab697阅读 3,274评论 0 22
  • 概述在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似...
    liudhkk阅读 8,529评论 3 38
  • 年轻 些许的人,些许的雨,穿梭在风里,交织进黄昏。看到了似曾相识的年轻,那时总是迷茫地要些什么、忘些什么、恨些什么...
    岸边的鱼哥哥阅读 139评论 0 0
  • 今晚一直在忙着不知道有什么意义的工作,累的眼花缭乱,公寓还停水了,带着一身疲倦,瘫在我的小床上,却辗转反侧,回顾自...
    竺花叶阅读 106评论 0 1
  • 文 / 熊太行 他,六十多岁,圆脸微胖。 小眼睛有神,没太多头发。 在一座以堕落著称的城市中勤勤恳恳工作了很多年,...
    熊太行阅读 1,795评论 1 7
  • 高明总是有原因的。 当我看完英国一名校的国际化战略文件,着实觉得学到不少东西,无论是用词方面还是逻辑方面。然而当我...
    劈柴捌哥阅读 98评论 0 0