💬

[SwiftUI]if文でViewを切り替えると全体が再描画される

2021/08/06に公開

SwiftUIで全体の再描画の挙動

SwiftUIで実装していて、ある画面の内容を出し分ける場合がありました。具体的には、APIリクエストを送り結果があればリスト表示、エラーがあればエラーの内容表示する、といった感じです。
最初のAPIリクエストをonAppearで呼ぶ処理を入れていたところ、何度もリクエストされてしまうという不具合が発生していました。

struct ContentView: View {
  var body: View {
    Group {
      if 成功した場合 {
        リスト表示
      } else if 失敗した場合 {
        エラー内容表示
      } else {
        空表示        
      }
    }.onAppear {
      APIリクエスト処理
    }
  }
}

Groupで囲っていれば、全体の再描画はされない予想でしたが、再描画されていました。

環境

  • Xcode: 12.5.1
  • iOS: 14.5

対策

今回のような場合、onAppearではなくViewのinitViewModel等の初期化処理でAPIリクエスト処理を行うことで解決しました。

Discussion