核心animation警告:“未提交的CATransaction”

我只收到以下警告:

CoreAnimation: warning, deleted thread with uncommitted CATransaction; created by: 0 QuartzCore 0x3763c65d <redacted> + 220 1 QuartzCore 0x3763c541 <redacted> + 224 2 QuartzCore 0x3763fe2f <redacted> + 30 3 QuartzCore 0x3763b9bf <redacted> + 318 4 QuartzCore 0x3763b87b <redacted> + 50 5 QuartzCore 0x3763b80b <redacted> + 538 6 MyApp 0x000df597 -[CommonClass orangeGradient:] + 382 7 MyApp 0x000f70e1 -[HomeViewController updateStatusBar] + 1700 8 MyApp 0x000f61bd -[HomeViewController statusRecieved] + 224 9 MyApp 0x000cd323 -[CommonClass statusReceivedFromServer] + 142 10 MyApp 0x000d833d -[CommonClass accountStatus] + 7416 11 Foundation 0x35a3767d <redacted> + 972 12 libsystem_c.dylib 0x35c9a311 <redacted> + 308 13 libsystem_c.dylib 0x35c9a1d8 thread_start + 8 

我的方法是在堆栈顶部如下所示:

 - (void)orangeGradient: (UILabel *)fillLabel { @synchronized([CommonClass class]) { CAGradientLayer * gradientLayer = [CAGradientLayer layer]; gradientLayer.frame = fillLabel.bounds; gradientLayer.colors = [NSArray arrayWithObjects:(id)[UIColorFromRGB(0xfbb250) CGColor],(id)[UIColorFromRGB(0xf47c2a) CGColor], nil]; [fillLabel.layer addSublayer:gradientLayer]; } } 

任何想法,为什么会这样,我怎样才能解决这个问题?

它看起来像orangeGradient:从后台线程调用。 Core Animation将所有更改分组为CATransactions。 通常这是从运行循环自动完成的。 在后台线程中(通常)没有运行循环,所以你必须自己创build事务:

 - (void)orangeGradient: (UILabel *)fillLabel { @synchronized([CommonClass class]) { [CATransaction begin]; CAGradientLayer * gradientLayer = [CAGradientLayer layer]; gradientLayer.frame = fillLabel.bounds; gradientLayer.colors = [NSArray arrayWithObjects:(id)[UIColorFromRGB(0xfbb250) CGColor],(id)[UIColorFromRGB(0xf47c2a) CGColor], nil]; [fillLabel.layer addSublayer:gradientLayer]; [CATransaction commit]; } } 

还有一个问题:UIKit不是线程安全的。 您不能在后台线程上调用UILabel bounds

检查代码中的任何地方有一个未提交的 CATransaction 。 您将需要按照以下方式执行此操作;

 [CATransaction begin]; [CATransaction setDisableActions:YES]; [commonClassObject orangeGradient:lblFill]; [CATransaction commit]; 

[编辑]

基本上这个问题发生在CoreAnimation完成之前,NSOperation完成。 这两个类之间必须存在一些关系,在你的代码中你需要弄清楚。

我只是补充说,我从后台线程initWithFrame有同样的问题。

看起来,从iOS 7开始,对UIKit的一些调用必须在主线程下完成,并且不能从后台线程中调用。

另外请注意,这样几个警告后,我的应用程序完全停止响应。 所以最好不要忽视这样的警告。