0

backgroundColor以下のコードは、 の直後にを更新しcommitます。

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

sleep(5);

しかし、ネストされた explicitCATransactionsを使用すると、最も外側のトランザクションがコミットされた場合にのみ画面が更新されます。

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

したがって、これは非常に奇妙です。なぜなら、runloop がループごとに最も外側の暗黙的なトランザクションを作成することがわかっているからです。コミットimplicit transaction時にこれが最も外側のトランザクションと見なされないのはなぜですか?explicit transaction

4

1 に答える 1

2

常に暗黙のトランザクションがあります。明示的なトランザクションも存在する可能性があります。すべてのコードの実行が完了するまで、暗黙的なトランザクションはコミットされません。明示的なトランザクション (beginおよびcommit) がある場合、 が検出されたときにコミットされcommitます。

ネストされた明示的なトランザクションの目的は、アニメーションのさまざまな部分にさまざまなパラメーター (期間など) を提供できるようにすることだけです。実際のコミットは、最も外側の まで行われませんcommitドキュメントを読む:

最も外側のトランザクションの変更をコミットした後でのみ、Core Animation は関連するアニメーションを開始します。

于 2016-09-05T03:15:27.780 に答える