LoginSignup
0
0

SwiftUIのページビューにおけるライフサイクルを観察する

Posted at

SwiftUIでは TabView を使ってページビューを作成できますが、多量のページを表示したい場合に負荷的な問題がないのか、ライフサイクルを観察してみました。

以下のコードを動かしてみます。

import SwiftUI

struct ContentView: View {
    var body: some View {
        TabView {
            ForEach((1..<100)) { id in
                Page(id: id)
            }
        }
        .tabViewStyle(.page)
    }
    
    private struct Page: View {
        let id: Int
        
        init(id: Int) {
            self.id = id
            print("Instantiate: \(id)")
        }
        
        var body: some View {
            print("Render: \(id)")
            return Text("Page\(id)")
                .onAppear { print("Appear: \(id)") }
                .onDisappear { print("Disappear: \(id)") }
        }
    }
}

アプリ起動後、以下のログが出力されました。

Instantiate: 1
Instantiate: 2
Instantiate: 3
...
Instantiate: 99
Instantiate: 1
Render: 1
Appear: 1

この後次のページへの切り替えを行なっていくと、

Instantiate: 2
Render: 2
Appear: 2
Instantiate: 3
Render: 3
Appear: 3
Disappear: 1
Disappear: 2
...

と出力されました。

推察するに、

  1. TabView の ViewBuilder でページ数分の Page がインスタンス化される
    (ページ数計上のため?そしてレンダリングは行わない)
  2. 実際に表示するページごとに Page をインスタンス化、表示のためレンダリング

という挙動になっているようです。

SwiftUIのViewは何度もインスタンス化されるものなので、 init に高負荷な処理を入れない限りは問題なさそうです!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0