
SwiftUIでリアクティブなコードを書く際に、onReceiveモディファイアが役立ちます。
特定のパブリッシャーからデータを受信するたびにアクションを実行するために使用されます。この記事では、onReceiveの使い方を具体的な例とともに紹介します。
onReceiveとは?
onReceiveは、Combineフレームワークなどのパブリッシャーからデータを受信したときに特定のアクションを実行するためのSwiftUIモディファイアです。
タイマーや通知、ネットワークの応答など、さまざまなデータソースからのデータ変更に反応することができます。
基本的な使い方
以下の例は、タイマーを使用して1秒ごとにカウンターを更新する方法を示しています。
例:タイマーを使用したカウンター
import SwiftUI
struct OnReceiveSmp: View {
@State private var counter = 0
private let timer = Timer.publish(every: 1.0, on: .main, in: .common).autoconnect()
var body: some View {
Text("Counter: \(counter)")
.padding()
.onReceive(timer) { _ in
counter += 1
}
}
}この例では、timerが毎秒発行するイベントを受信し、カウンターをインクリメントします。
通知センターとonReceive
通知センターからの通知を受け取るためにonReceiveを使用することもできます。
例:アプリがフォアグラウンドに戻ったときの処理
import SwiftUI
struct OnReceiveSmp: View {
@State private var message = "Waiting for notification"
var body: some View {
Text(message)
// アプリがForeGroundになった時
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
message = "App is back in foreground"
}
// アプリがバックグラウンドで動作している時
.onReceive(NotificationCenter.default.publisher(for: UIApplication.didEnterBackgroundNotification)) { _ in
message = "App is back in Background"
}
}
}

この例では、アプリがフォアグラウンドに戻ったときに通知を受け取り、メッセージを更新します。
CombineフレームワークとonReceive
onReceiveは、Combineフレームワークのパブリッシャーと組み合わせて使用することで、複雑なデータフローを簡単に管理できます。
例:ネットワークからのデータ受信
import SwiftUI
import Combine
class DataFetcher: ObservableObject {
@Published var data: String = "Loading..."
func fetchData() {
// 実際のネットワークリクエストのシミュレーション
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.data = "Data received from network"
}
}
}
struct ContentView: View {
@ObservedObject var fetcher = DataFetcher()
var body: some View {
Text(fetcher.data)
.padding()
.onAppear {
fetcher.fetchData()
}
.onReceive(fetcher.$data) { newValue in
print("New data received: \(newValue)")
}
}
}この例では、DataFetcherクラスがネットワークからデータをフェッチし、onReceiveモディファイアが新しいデータを受信したときに処理を実行します。
まとめ
onReceiveモディファイアは、SwiftUIでリアクティブなアプリケーションを構築するためのツールです。
タイマー、通知、ネットワーク応答など、さまざまなデータソースに対してリアクティブに反応できます。
この記事で紹介した例を参考にして、onReceiveを活用してみてください。

