SwiftUI: ビューツリー更新時にツリー全体が再生成されている

p0dee
2 min readMay 28, 2020

--

仕様なのか、既知のバグなのか。

例えば以下のように、ボタンを押すごとにカウントアップする実装があるとする。ボタンを押すたびにカウントが1ずつ加算され、その値を表示しているのはボタン自身のみとする。

この際カウントアップ時に再生成されるのは、期待としてはボタンのみであってほしいのだが、実際には、表示が固定であるラベル(“Simple Label”)も含め、ビューツリー全体が再生成されるという挙動をする。

これが先述の例のように、非常にシンプルな実装であれば問題にならないだろうが、次のようなケースでは注意が必要だと思われる。

ビューの表示や紐づく関数内で

  • 重い処理を行っている
  • 乱数にもとづく表示をしている

このような場合、描画更新毎に処理が再実行されてしまい、結果として動作の重さや、意図しない表示の原因となり得るためだ。

ラベルの表示は変化していないが…
表示時と描画更新時に、毎度実行されている

一方onApeear(_:)であれば、画面表示につき1度しか呼び出されないことが保証されているため、意識的に使用し分ければ良いと思っている。

--

--

No responses yet