iOS - viewWillAppear 和 viewDidAppear 为什么不在同一个 runloop中执行?

1. 视图展示流程

// 视图展示的基本流程
[viewController viewWillAppear:animated]; // 即将展示
    |
    ↓
[CATransaction begin]  // 开始处理界面更新
    |
    ↓
视图渲染过程         // 在这里会触发新的 RunLoop 循环
    |
    ↓
[CATransaction commit] // 提交更新
    |
    ↓
[viewController viewDidAppear:animated];  // 已经展示

2. RunLoop 与渲染

// RunLoop 的基本循环
do {
    // 第一个 RunLoop 循环
    // 处理 viewWillAppear
    // 准备渲染数据
    
    // 等待下一个 RunLoop
    
    // 第二个 RunLoop 循环
    // 完成渲染
    // 处理 viewDidAppear
    
} while (running);

3. 主要原因

1. 渲染时机

// viewWillAppear 在视图渲染前调用
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // 这里的修改会在下一次渲染时生效
    self.view.alpha = 0.5;
}

2. 异步渲染

// Core Animation 的渲染是异步的
[CATransaction begin];
// 视图修改
[CATransaction commit];
// 实际渲染发生在下一个 RunLoop

3. 状态保证

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // 此时确保视图已完全显示
    // 可以安全地进行后续操作
}

4. 实际影响

1. 时序保证

- (void)viewWillAppear:(BOOL)animated {
    // 在这里设置的属性
    self.view.alpha = 0;
    
    // 动画一定会在下一个 RunLoop 执行
    [UIView animateWithDuration:0.3 animations:^{
        self.view.alpha = 1;
    }];
}

2. 性能优化

- (void)viewWillAppear:(BOOL)animated {
    // 可以在这里进行耗时的准备工作
    [self prepareData];
}

- (void)viewDidAppear:(BOOL)animated {
    // 视图显示完成后再执行其他操作
    [self startNetworkRequest];
}

5. 最佳实践

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    // 1. 视图准备工作
    [self prepareViewState];
    
    // 2. 数据准备
    [self prepareData];
    
    // 3. 设置初始动画状态
    self.view.alpha = 0;
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    
    // 1. 执行展示动画
    [UIView animateWithDuration:0.3 animations:^{
        self.view.alpha = 1;
    }];
    
    // 2. 开始网络请求
    [self startNetworkRequest];
    
    // 3. 其他需要视图完全显示后的操作
    [self postViewAppearTasks];
}

这种设计的好处是:

  1. 确保视图渲染的正确性
  2. 提供清晰的生命周期回调
  3. 优化性能和用户体验
  4. 保证动画和视图更新的可靠性
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值