async / awaitの組み合わせで非同期処理を行う
ContentView.swift
func getWho() async -> String { await Task.sleep(5 * 1000 * 1000 * 1000) return "山本さん" } func getMessage() async -> String { await Task.sleep(3 * 1000 * 1000 * 1000) return "ハロー" } class StopWatch: ObservableObject { @Published var elapsedTime: Double = 0.0 private var timer = Timer() func start() { guard !timer.isValid else { return } self.elapsedTime = 0.0 timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { _ in self.elapsedTime += 0.01 } } func stop() { timer.invalidate() } } struct ContentView: View { @State var message:String = "" @ObservedObject var watch = StopWatch() var body: some View { VStack { Button(action: { Task { watch.start() message = "_ _ _" async let who = getWho() async let msg = getMessage() message = await who + "," + msg + " ! " watch.stop() } }) { Label("async TEST", systemImage: "testtube.2") .background( Capsule() .stroke(lineWidth: 1) .frame(width: 180, height: 40) ) }.padding(30) Text("\(message)").font(.title2) let milliSeconds = Int((watch.elapsedTime) * 100)%100 let seconds = Int(watch.elapsedTime) Text("\(seconds).\(milliSeconds)").padding() Spacer() } } }
OK, もう一声