File tree 2 files changed +57
-0
lines changed
2 files changed +57
-0
lines changed Original file line number Diff line number Diff line change
1
+ # イニシャライザを低コストにする
2
+ Viewのイニシャライザは何度も呼び出されるため、低コストに保ちます。
3
+
4
+ ## Overview
5
+ 高コストなイニシャライザはよくあるパフォーマンス低下の原因です。
6
+
7
+ ``` swift
8
+ struct DogRootView : View {
9
+ @State private var model = FetchModel ()
10
+
11
+ var body: some View {
12
+ DogList (model.dogs )
13
+ }
14
+ }
15
+
16
+ @Observable class FetchModel {
17
+ var dogs: [Dog]
18
+
19
+ init () {
20
+ fetchDogs ()
21
+ }
22
+
23
+ func fetchDogs () {
24
+ // Takes a long time
25
+ }
26
+ }
27
+ ```
28
+
29
+ この例では` DogRootView ` のイニシャライザで` FetchModel ` がイニシャライズされます。
30
+ ` FetchModel ` のイニシャライザで処理に時間のかかる` fetchDogs ` が同期的に呼び出されているため、` DogRootView ` のイニシャライザが高コストとなっています。
31
+
32
+ ### task modifierでイニシャライザのコストを下げる
33
+ この場合は、` fetchDogs ` を` async ` にし、` .task ` で非同期にデータを読み込むことでイニシャライザを低コストにします。
34
+
35
+ ``` swift
36
+ struct DogRootView : View {
37
+ @State private var model = FetchModel ()
38
+
39
+ var body: some View {
40
+ DogList (model.dogs )
41
+ .task { await model.fetchDogs () }
42
+ }
43
+ }
44
+
45
+ @Observable class FetchModel {
46
+ var dogs: [Dog]
47
+
48
+ init () { }
49
+
50
+ func fetchDogs () async {
51
+ // Takes a long time
52
+ }
53
+ }
54
+ ```
55
+
56
+ > WWDC23 Demystify SwiftUI performance [ 12:20~ ] ( https://developer.apple.com/videos/play/wwdc2023/10160/?time=740 )
Original file line number Diff line number Diff line change 41
41
- < doc:ChangeValueWhenSwitchingStyle >
42
42
- < doc:HideViewWithOpacityWhenAvailable >
43
43
- < doc:AssignUniqueValueToForEachID >
44
+ - < doc:MakeInitializerLowCost >
44
45
45
46
### The Art of API Design
46
47
- < doc:ProvidesContainerViewAccessViaProxy >
You can’t perform that action at this time.
0 commit comments