2016-09-05 15 views
-1

Код ниже обновит backgroundColor сразу после commit.Ведение вложенного CATransaction?

[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 создаст внешнюю самую неявную транзакцию в каждом цикле. Почему это implicit transaction не рассматривается как внешняя большая транзакция, когда explicit transaction совершает?

ответ

0

Существует неявная транзакция всегда. Также может быть явная транзакция. Неявная транзакция не фиксируется до тех пор, пока весь ваш код не завершится. Если у вас есть явная транзакция (begin и commit), она совершает ошибку, когда встречается commit.

Назначение Вложенные явные транзакции предназначены только для предоставления различных параметров (например, продолжительности) для разных частей анимации; фактическая фиксация не происходит до самого внешнего commit. Читайте the docs:

только после того, как вы фиксируете изменения для внешней транзакции делает Core Animation начать связанные анимации

+0

Так что, когда берут о вложенных транзакциях мы всегда относимся к явным сделкам? – Karl

+0

Да, ваш второй пример - о вложенных явных транзакциях, одна пара «begin ... commit» внутри друг друга. Явная транзакция не «вложена» в неявную транзакцию каким-либо интересным способом, потому что она зафиксирована и, следовательно, не имеет отношения к тому, что позже будет подразумевать неявная транзакция. – matt