とある日にキーボード入力が重いことに気づいた俺。
なんでだろうと、Viewの更新処理について学び直した。
struct ContentView: View {
@State var inputValue = ""
var body: some View {
let _ = print("ContentView")
TextField("なんか入力して", text: $inputValue)
}
}
文字が入力されるたびにContentViewが再描画されているのがわかる。キーボードを入力するたびに再描画されるわけだから、ContentViewが重いViewだと危険だよね。
それってどういうViewなんだよと思う人のために用意してみた。
struct ContentView: View {
@State var inputValue = ""
var items: [String] {
var res = [String]()
for i in 1..<1000000 {
res.append(i.description)
}
return res
}
var body: some View {
VStack {
let _ = print("ContentView")
Text(items.count.description)
TextField("あなたの名前", text: $inputValue)
}
}
}
これキーボード入力するたびにforループが走るので、てぇーへんなことになります。
めちゃくちゃ重い。エラーとか警告も表示されないので結構気づかない。
BigなJSONをダウンロードしてちょっとループさせて内部で変換するときとかに、たまにやってしまうんよ。
onAppearで配列を初期化すればViewの再描画時に無駄なループ処理が走らなくなる。
struct ContentView: View {
@State var inputValue = ""
@State var items = [String]()
var body: some View {
VStack {
let _ = print("ContentView")
Text(items.count.description)
TextField("あなたの名前", text: $inputValue)
}
.onAppear {
print("onAppear")
var res = [String]()
for i in 1..<1000000 {
res.append(i.description)
}
items = res
}
}
}
キーボード重くね?って思ったら疑ってみてくだされ