回答編集履歴

1

「getData()が呼び出されていない」件についての追記をしました。

2022/09/08 00:27

投稿

退会済みユーザー
test CHANGED
@@ -45,3 +45,72 @@
45
45
  ちょっと今回の質問とは別の問題になると思いますので、
46
46
  必要であればまた別に質問していただければと思います。
47
47
 
48
+ ## 追記です。
49
+
50
+ コメントありがとうございます。
51
+
52
+ 不明な点がありましたら
53
+ 解決済みにせずに回答者に確認しても良いかもしれませんね。
54
+
55
+ > エラーは解消されましたが、getData()が呼び出されていないみたいです、、、
56
+
57
+ おそらく `getData()` は呼び出されているのではないかと思っています。
58
+ 問題を正しく認識しないと対処もできないと思いますので、
59
+ 問題になっていそうなポイントをサンプルのコードとして書いてみました。
60
+ タップするとindex(カウンター)が1ずつ増えていくだけのものです。
61
+
62
+ でもこれは動きません。
63
+ View -> LocationsViewModel -> FirebaseViewModel
64
+ という参照があって、
65
+ FirebaseViewModelの内容を変更しているためです。
66
+ Viewが変更を受け取れるのはLocationsViewModelの中のプロパティ”自身”だけです。
67
+ LocationsViewModelのmodelプロパティの”中身”(FirebaseViewModelの中のプロパティ)が変わってもViewは変更を受け取れないのです・・
68
+
69
+ どう対処するのが良いのかは私自身まだ理解できていませんので、
70
+ 勉強しておきたいと思います・・
71
+
72
+ ```swift
73
+ import SwiftUI
74
+
75
+ struct ContentView: View {
76
+ @ObservedObject var vm = LocationsViewModel()
77
+ var body: some View {
78
+ Text("Hello, world!")
79
+ .padding()
80
+ Text("index: \(vm.model.index)")
81
+ Button("tap", action: action)
82
+ }
83
+ func action() {
84
+ // indexを変更してもViewには反映されません。
85
+ vm.model.index += 1
86
+ print("index: \(vm.model.index)")
87
+ // model自体が変わるのであればViewは変更を受け取れます。
88
+ // 例えば強引ですが...modelをmodelに再代入するとViewは変更を受け取れます...
89
+ // vm.model = vm.model
90
+ }
91
+ }
92
+
93
+ class LocationsViewModel: ObservableObject {
94
+ @Published var model: FirebaseViewModel
95
+ init() {
96
+ let initmodel = FirebaseViewModel()
97
+ self.model = initmodel
98
+ }
99
+ }
100
+
101
+ class FirebaseViewModel: ObservableObject {
102
+ @Published var index = 0
103
+ init() {
104
+ getData()
105
+ }
106
+ func getData() {
107
+ print("getData")
108
+ DispatchQueue.main.async {
109
+ // indexを変更してもViewには反映されません。
110
+ self.index = 10
111
+ print("index(getData): \(self.index)")
112
+ }
113
+ }
114
+ }
115
+ ```
116
+