1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SwiftUI使うなら重い処理はonAppearに入れとこう。。。

Posted at

とある日にキーボード入力が重いことに気づいた俺。

なんでだろうと、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
		}
	}
}

キーボード重くね?って思ったら疑ってみてくだされ

1
2
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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?