Поведение вложенной CATransaction?

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

[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?


person Karl    schedule 05.09.2016    source источник


Ответы (1)


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

Цель вложенных явных транзакций состоит только в том, чтобы предоставить вам разные параметры (например, продолжительность) для разных частей анимации; фактическая фиксация не происходит до самого внешнего commit. Прочтите документацию:

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

person matt    schedule 05.09.2016
comment
Итак, когда речь идет о вложенных транзакциях, мы всегда ссылаемся на явные транзакции? - person Karl; 05.09.2016
comment
Да, ваш второй пример касается вложенных явных транзакций, одной пары begin...commit внутри друг друга. Явная транзакция не вложена в неявную транзакцию каким-либо интересным образом, потому что она фиксируется и, таким образом, не имеет отношения к тому, что неявная транзакция будет делать позже. - person matt; 05.09.2016