回答編集履歴

1

修正案の動作確認をしていた時のコードを追記しました。

2021/11/03 11:30

投稿

__k_san__
__k_san__

スコア177

test CHANGED
@@ -111,3 +111,203 @@
111
111
  })
112
112
 
113
113
  ```
114
+
115
+
116
+
117
+ ---
118
+
119
+
120
+
121
+ 追記:
122
+
123
+ ちょっと長くなってしまいますが、質問に掲載されていたコードをなるべくそのまま使う形にて修正案の動作確認していたときのコードを以下にて共有します。(重たい処理は仮に `sleep(10)` としています。)
124
+
125
+ ```swift
126
+
127
+ import SwiftUI
128
+
129
+
130
+
131
+ struct Constants {
132
+
133
+ static let RESULT_OK: Int = 0
134
+
135
+ }
136
+
137
+
138
+
139
+ struct ContentView: View {
140
+
141
+
142
+
143
+ //プログレスビュー表示フラグ
144
+
145
+ @State var isProgressShowing: Bool = false
146
+
147
+ //処理クラス
148
+
149
+ @ObservedObject var predictorIns: InspectorModel_Crossing = InspectorModel_Crossing()
150
+
151
+ //処理結果
152
+
153
+ @State var predictRslt: Int = 0
154
+
155
+
156
+
157
+ var recentImageName = "hoge"
158
+
159
+
160
+
161
+ var body: some View {
162
+
163
+ ZStack {
164
+
165
+
166
+
167
+ Button(action: {
168
+
169
+ //実施
170
+
171
+ predictorIns.startInspect(imageName: self.recentImageName + ".JPG") { result in
172
+
173
+ self.predictRslt = result
174
+
175
+ }
176
+
177
+ }, label: {
178
+
179
+ Text("開始")
180
+
181
+ })
182
+
183
+
184
+
185
+ //測定中はその旨表示する
186
+
187
+ if self.isProgressShowing {
188
+
189
+ Color.white
190
+
191
+ .opacity(0.7)
192
+
193
+ .edgesIgnoringSafeArea(.all)
194
+
195
+ .overlay(
196
+
197
+ ProgressView("処理中…")
198
+
199
+ .foregroundColor(.black)
200
+
201
+ )
202
+
203
+ }
204
+
205
+ }
206
+
207
+ .frame(width: 700)
208
+
209
+
210
+
211
+ //処理開始時処理
212
+
213
+ .onChange(of: self.predictorIns.proccessingStartedFlg, perform: { value in
214
+
215
+
216
+
217
+ print("proccessingStartedFlg changed (value=(value))")
218
+
219
+
220
+
221
+
222
+
223
+ self.isProgressShowing = true
224
+
225
+
226
+
227
+ })
228
+
229
+ //処理終了時処理
230
+
231
+ .onChange(of: self.predictorIns.proccessingFinishedFlg, perform: { value in
232
+
233
+
234
+
235
+ print("proccessingFinishedFlg changed (value=(value))")
236
+
237
+
238
+
239
+ // 処理中画面非表示
240
+
241
+ self.isProgressShowing = false
242
+
243
+
244
+
245
+ //測定結果がOKであれば
246
+
247
+ if self.predictRslt == Constants.RESULT_OK {
248
+
249
+
250
+
251
+ // ~~~後処理を実施~~~
252
+
253
+ }
254
+
255
+
256
+
257
+ })
258
+
259
+
260
+
261
+ }
262
+
263
+
264
+
265
+ }
266
+
267
+
268
+
269
+ class InspectorModel_Crossing: ObservableObject {
270
+
271
+ //処理開始を知らせるフラグ(開始するとフラグが変化する)
272
+
273
+ @Published var proccessingStartedFlg: Bool = false
274
+
275
+ //処理終了を知らせるフラグ(終了するとフラグが変化する)
276
+
277
+ @Published var proccessingFinishedFlg: Bool = false
278
+
279
+
280
+
281
+ //処理の開始
282
+
283
+ func startInspect(imageName: String, uiImageObj: UIImage? = nil, completion: ((Int) -> Void)? = nil) {
284
+
285
+
286
+
287
+ self.proccessingStartedFlg.toggle()
288
+
289
+
290
+
291
+ DispatchQueue.main.async {
292
+
293
+ // ~~~すごく重たい処理~~~
294
+
295
+ sleep(10)
296
+
297
+
298
+
299
+ self.proccessingFinishedFlg.toggle()
300
+
301
+
302
+
303
+ completion?(Constants.RESULT_OK)
304
+
305
+ }
306
+
307
+ }
308
+
309
+
310
+
311
+ }
312
+
313
+ ```