美文网首页
tableView reloadData 刷新结束后再执行后续操

tableView reloadData 刷新结束后再执行后续操

作者: wg刚 | 来源:发表于2018-09-12 17:35 被阅读0次

    [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];
    

    结果:解决问题

    相关文章

      网友评论

          本文标题:tableView reloadData 刷新结束后再执行后续操

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