嵌套 CATransaction 的行为?

Posted

技术标签:

【中文标题】嵌套 CATransaction 的行为?【英文标题】:Behave of nested CATransaction? 【发布时间】:2016-09-05 03:06:49 【问题描述】:

下面的代码将在commit 之后立即更新backgroundColor

[CATransaction begin];
self.view.backgroundColor = [UIColor redColor];
[CATransaction commit];

sleep(5);

但是对于嵌套显式CATransactions,只有在最外层事务提交时才会更新屏幕。

[CATransaction begin];
[CATransaction begin];
self.view.backgroundColor = [UIColor redColor];
[CATransaction commit];
sleep(5);
[CATransaction commit];

所以这很奇怪,因为我们知道 runloop 会在每个循环中创建一个最外层的隐式事务。为什么当explicit transaction 提交时,这个implicit transaction 不被视为最外层事务?

【问题讨论】:

【参考方案1】:

始终存在隐式事务。也可以有显式事务。在所有代码完成运行之前,隐式事务不会提交。如果您有一个显式事务(begincommit),那么它会在遇到 commit 时提交。

嵌套显式事务的目的只是为了让您为动画的不同部分提供不同的参数(例如持续时间);实际提交直到最外面的commit 才会发生。阅读the docs:

只有在您提交最外层事务的更改后,Core Animation 才会开始关联动画

【讨论】:

那么当我们谈到嵌套事务时,我们总是指显式事务? 是的,你的第二个例子是关于嵌套的显式事务,一个 begin...commit 对在彼此内部。显式事务不会以任何有趣的方式“嵌套”在隐式事务中,因为它已提交,因此与隐式事务稍后将执行的操作无关。

以上是关于嵌套 CATransaction 的行为?的主要内容,如果未能解决你的问题,请参考以下文章

CATransaction 完成块永远不会触发

CATransaction 动画问题

CATransaction 完成块成功或失败

CATransaction 和 CAAnimation 有啥区别?

我可以取消 CATransaction 完成块吗?

如何让 CATransaction 无限重复? - 斯威夫特