Swiftでは重たい処理での非同期処理を適切に行わないとViewが実行中に操作不能になります。
以下が簡単なサンプルです。
これを応用すれば重たい変換処理中にユーザーに進捗状況を表示できます。
struct ContentView: View {
@State private var progress: Double = 0.0
var body: some View {
VStack {
Text("\(Int(progress * 100))%")
.font(.title)
.padding()
ProgressView(value: progress, total: 100.0)
.progressViewStyle(LinearProgressViewStyle())
.padding()
Button("Start") {
startProgress(progress2: $progress)
}
.padding()
}
}
private func startProgress(progress2: Binding<Double>) {
DispatchQueue.global().async {
(0..<100).forEach { index in
sleep(1)
DispatchQueue.main.async {
progress2.wrappedValue += 0.01
print(progress2.wrappedValue)
}
}
}
}
}