0%

CATransaction 踩坑:completion block 没有立即调用

之前写过一篇博客,介绍CATransaction的使用:理解CATransaction。文中提到,当需要监听动画结束时,可以利用-[CATransaction setCompletionBlock:]方法监听动画的结束,而不用修改接口参数。然而,利用这个方法监听动画结束,有一定的风险会导致 completionBlock 不被调用。

简单例子如下:

1
2
3
4
5
6
[CATransaction begin];
[CATransaction setCompletionBlock:^{
//complete block
}];
[self doAnimation]
[CATransaction commit];

一般情况下 completionBlock都会被调用。

但是当[self doAnimation]中做了一个repeatCount=HUGE_VALF的动画时,动画永远不会结束,因此, completionBlock 就永远不会被调用。

在同一个类中利用CATransaction来监听动画结束问题不大,但是做动画的代码中还会调用外面的类的话,就需要小心了。