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()会等待主队列空闲后才执行。
参考链接

你可能感兴趣的:(iOS tableView reloadData 刷新结束后执行下一步操作)