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];
}
这种设计的好处是:
- 确保视图渲染的正确性
- 提供清晰的生命周期回调
- 优化性能和用户体验
- 保证动画和视图更新的可靠性
1322

被折叠的 条评论
为什么被折叠?



