Balbas Code

SwiftUIで非同期処理を使う

公開日: 2023-09-28 22:19:07
更新日: 2023-09-28 23:04:12


なかなか高難易度な初級非同期処理について調べました。
便利というかなんか格好いいのとは裏腹に、凶悪です(笑)
デバッグの動き方も特殊で、メインスレッドやサブスレッドと特性を理解しておかないと大変なことになります。

メモリ落ちし出したら、どんな動き方をしているのか?把握するのに本当に苦労しました。


SwiftUI 2.0 (iOS 15+ / macOS 12+) では、非同期処理の実装がさらに簡単になりました。以下に、SwiftUIで非同期処理を行う初級編を示します。


非同期APIの使用
Swift 5.5からは、async/await という新しい非同期APIが追加されています。これを利用して、非同期処理を簡単に記述できます。
例えば、非同期にデータを取得する関数があるとします。


func fetchData() async -> String {
await Task.sleep(2 * 1_000_000_000) // 2秒待機
return "Data Loaded"
}

SwiftUIの非同期機能の使用
SwiftUIのTask を使って非同期処理を行うことができます。Task { } ブロック内で async 関数を呼び出すことができます。


struct ContentView: View {
@State private var data: String? = nil

var body: some View {
VStack {
if let data = data {
Text(data)
} else {
Text("Loading...")
}
}
.task {
data = await fetchData()
}
}
}


この例では、ContentView が表示されたときに非同期で fetchData 関数を呼び出し、その結果を data という @State プロパティに格納しています。データが読み込まれるまで "Loading..." と表示され、データが読み込まれたらその内容が表示されます。

非同期画像の読み込み
SwiftUIでは、非同期に画像を読み込むための AsyncImage も提供されています。


AsyncImage(url: URL(string: "https://example.com/image.jpg")) { image in
image.resizable().scaledToFit()
} placeholder: {
ProgressView()
}

 


上記の例では、URLから非同期に画像を読み込みます。画像が読み込まれるまでの間は ProgressView が表示され、画像が読み込まれたらその画像が表示されます。


このように、SwiftUIとSwift 5.5の非同期APIを組み合わせることで、非常に簡単に非同期処理を実装することができます。