前提・実現したいこと
SwiftUIにて画面部及び処理部を作成しています。
今回、処理部で行う処理において10秒程度かかる重たい処理があるため、
処理中は「処理中…」という内容のプログレスビューを画面上に表示し、ユーザにその旨を知らせたいです。
現在は、処理クラスのインスタンスをObservedObjectとして画面側に持ち、
処理クラス内でPublished宣言されている処理開始/終了を示すフラグの変化を画面側で検知して、
表示のON/OFFを切り替えようとしています。
発生している問題・エラーメッセージ
処理開始/終了を示すフラグの変化検知について、画面側で検知できているにはできているのですが、
処理クラスの処理が完全に終わった後(下記コードのstartInspect()がreturnした後)に、処理開始/終了を示すフラグ双方の変化検知がほぼ同時に走ってしまい、困っています。
・実現したい動き
1.処理呼び出し
2.処理開始フラグをtoggle
3.画面側で処理開始フラグ変化検知して処理開始時処理(「処理中」表示フラグON)を実施
4.重たい処理を実行
5.処理終了フラグをtoggle
6.画面側で処理終了フラグ変化検知して処理終了時処理(「処理中」表示フラグOFF)を実施
・現在の動き
1.処理呼び出し
2.処理開始フラグをtoggle
3.重たい処理を実行
4.処理終了フラグをtoggle
5.画面側で処理開始フラグ変化検知して処理開始時処理(「処理中」表示フラグON)を実施
6.画面側で処理終了フラグ変化検知して処理終了時処理(「処理中」表示フラグOFF)を実施
上記のような動きになってしまっているため、下記コードのisProgressShowingフラグが一瞬しかtrueにならず、
プログレスビューを表示することができません。
どうしたら実現したい動きを実施できるのでしょうか?
該当のソースコード
↓画面部
SwiftUI
1import SwiftUI 2 3struct ManualInspection_Crossing: View { 4 5 //プログレスビュー表示フラグ 6 @State var isProgressShowing: Bool = false 7 //処理クラス 8 @ObservedObject var predictorIns: InspectorModel_Crossing = InspectorModel_Crossing() 9 //処理結果 10 @State var predictRslt: Int = 0 11 12 var body: some View { 13 ZStack { 14 15 Button(action: { 16 17 //重い処理を非同期で行う 18 DispatchQueue.main.async { 19 //実施 20 self.predictRslt = predictorIns.startInspect(imageName: self.recentImageName + ".JPG") 21 22 } 23 }, label: { 24 Text("開始") 25 }) 26 27 //測定中はその旨表示する 28 if self.isProgressShowing { 29 Color.white 30 .opacity(0.7) 31 .edgesIgnoringSafeArea(.all) 32 .overlay( 33 ProgressView("処理中…") 34 .foregroundColor(.black) 35 ) 36 } 37 } 38 .frame(width: 700) 39 40 //処理開始時処理 41 .onChange(of: self.predictorIns.proccessingStartedFlg, perform: { value in 42 43 self.isProgressShowing = true 44 45 }) 46 //処理終了時処理 47 .onChange(of: self.predictorIns.proccessingFinishedFlg, perform: { value in 48 49 // 処理中画面非表示 50 self.isProgressShowing = false 51 52 //測定結果がOKであれば 53 if self.predictRslt == Constants.RESULT_OK { 54 55 ~~~後処理を実施~~~ 56 } 57 58 }) 59 60 } 61 62} 63
↓処理部
Swift
1import Foundation 2 3class InspectorModel_Crossing: ObservableObject { 4 //処理開始を知らせるフラグ(開始するとフラグが変化する) 5 @Published var proccessingStartedFlg: Bool = false 6 //処理終了を知らせるフラグ(終了するとフラグが変化する) 7 @Published var proccessingFinishedFlg: Bool = false 8 9 //処理の開始 10 func startInspect(imageName: String, uiImageObj: UIImage? = nil) -> Int { 11 12 self.proccessingStartedFlg.toggle() 13 14 ~~~すごく重たい処理~~~ 15 16 self.proccessingFinishedFlg.toggle() 17 18 return Constants.RESULT_OK 19 } 20 21} 22
補足情報(FW/ツールのバージョンなど)
Xcode:Ver.12.3
シミュレータiOS:14.3
Swift:Ver.5.3.2
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/03 11:16
2021/11/03 11:36 編集
2021/11/04 02:20