[self.tableView reloadData]并不会等待tableview更新结束后才执行后续代码,而是立即执行后续代码
做个试验:
代码如下
@interface ViewController ()<UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) NSArray *dataArr;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"ViewController";
[self buildView];
[self loadData];
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSLog(@"----->111111");
[self.tableView reloadData];
//把下句注释掉
// [self.tableView layoutIfNeeded];
NSLog(@"----->4444");
}
- (void)buildView{
[self.view addSubview:self.tableView];
}
- (void)loadData{
self.dataArr = @[@"实验一些概念", @"绘制时钟", @"创建平移/缩放/旋转动画", @"笑脸", @"心跳", @"关键帧动画", @"mask遮罩", @"扇形菜单"];
}
#pragma mark -<UITableViewDelegate, UITableViewDataSource>
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.dataArr.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"----->22222");
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([UITableViewCell class]) forIndexPath:indexPath];
cell.textLabel.text = [self.dataArr objectAtIndex:indexPath.row];
NSLog(@"----->33333");
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
#pragma mark -懒加载
-(UITableView *)tableView{
if (!_tableView) {
_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, WGWIDTH, WGHEIGHT) style:UITableViewStylePlain];
_tableView.backgroundColor = [UIColor whiteColor];
_tableView.delegate = self;
_tableView.dataSource = self;
[_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:NSStringFromClass([UITableViewCell class])];
}
return _tableView;
}
-(NSArray *)dataArr{
if (!_dataArr) {
_dataArr = [[NSArray alloc] init];
}
return _dataArr;
}
结果:
虽然都在主线程上执行,但是执行顺序并不是1、2、3、4
而是:1,4,2,3
满足不了向tableview刷新结束在执行后续操作的需求
解决:在[self.tableView reloadData];后面添加
[self.tableView layoutIfNeeded];
结果:解决问题
网友评论